博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Search a 2D Matrix
阅读量:6237 次
发布时间:2019-06-22

本文共 2512 字,大约阅读时间需要 8 分钟。

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

 

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

 

For example,

Consider the following matrix:

[  [1,   3,  5,  7],  [10, 11, 16, 20],  [23, 30, 34, 50]]

Given target = 3, return true.

 

从右上角向左下角搜索,初始row = 0, col = n - 1; 如果当前值等于目标值,返回真,如果以目标值大,则舍弃当前列,否则舍弃当前行。

1 class Solution { 2 public: 3     bool searchMatrix(vector
> &matrix, int target) { 4 int row = 0, col = matrix[0].size() - 1; 5 while (row < matrix.size() && col >=0) { 6 if (matrix[row][col] == target) { 7 return true; 8 } else if (matrix[row][col] > target) { 9 --col;10 } else {11 ++row;12 }13 }14 return false;15 }16 };

 第二遍做的时候发现其实这个矩阵不完全是杨氏矩阵,可以使用二分搜索,下面是代码。

1 class Solution { 2 public: 3     bool searchMatrix(vector
> &matrix, int target) { 4 int m = matrix.size(); 5 int n = matrix[0].size(); 6 int L = 0, R = n * m - 1, M; 7 int col, row; 8 while (L <= R) { 9 M = L + ((R - L) >> 1);10 row = M / n;11 col = M % n;12 if (matrix[row][col] > target) R = M - 1;13 else if (matrix[row][col] < target) L = M + 1;14 else return true;15 }16 return false;17 }18 };

 上面是对所有元素二分,复杂度是log(n*m),还可以更优化一点,对于普通的杨氏矩阵也适用,复杂度为log(n)+log(m).

1 class Solution { 2 public: 3     bool searchMatrix(vector
> &matrix, int target) { 4 int row = lowerBound(matrix, target); 5 if (row == -1) return false; 6 return binSearch(matrix, target, row); 7 } 8 9 int lowerBound(vector
> &matrix, int target) {10 int L = 0, R = matrix.size() - 1, M;11 while (L <= R) {12 M = L + ((R - L) >> 1);13 if (matrix[M][0] <= target) L = M + 1;14 else R = M - 1;15 }16 return R;17 }18 19 bool binSearch(vector
> &matrix, int target, int row) {20 int L = 0, R = matrix[row].size() - 1, M;21 while (L <= R) {22 M = L + ((R - L) >> 1);23 if (matrix[row][M] < target) L = M + 1;24 else if (matrix[row][M] > target) R = M - 1;25 else return true;26 }27 return false;28 }29 };

 

转载地址:http://zbdia.baihongyu.com/

你可能感兴趣的文章
如何创建只读域控制器RODC(Read-Only Domain Controller)
查看>>
python-字符串
查看>>
LabVIEW串口通信
查看>>
2017UGUI之slider
查看>>
python下载酷狗音乐源码
查看>>
MySQL学习----explain查看一条sql 的性能
查看>>
第零次作业
查看>>
Android + eclipse +ADT安装完全教程
查看>>
【批处理学习笔记】第七课:简单的批处理命令(6)
查看>>
leetcode 【 Subsets 】python 实现
查看>>
leetcode 【 Intersection of Two Linked Lists 】python 实现
查看>>
codeforces 767A Snacktower(模拟)
查看>>
用 Quartz 画聊天对话框背景实例
查看>>
Quartz2D简单绘制之饼状图
查看>>
你优化系统的目标是什么?
查看>>
SVN(64位)报 Failed to load JavaHL Library. 的解决方法
查看>>
基本运算符
查看>>
黄聪:WordPress 多站点建站教程(三):主站如何调用子站的文章内容、SQL语句如何写?...
查看>>
Activity的启动模式 4种launchMode Intent.FLAG_NEW_TASK 详解
查看>>
hdu 2254 奥运 **
查看>>