剑指 Offer 04. 二维数组中的查找
当我们需要解决一个复杂的问题时,一个有效的办法就是从一个具体的问题入手,通过分析简单具体的例子,试图寻找普遍的规律。针对
这个问题,我们也不妨从一个具体的例子入手。
1 | 2 | 8 | 9 |
---|---|---|---|
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
假如我们要查找7,从左上角开始。7大于1,所以7可能存在于1的右边或者下边。如下图
这样看起来不好分析。因为我们下一步要进行检索的区域分为两部分,且有重合。所以我们换个入手角度。
从右上角开始。9 > 7。因为,从上到下递增。所以7不可能存在于9所在的列。消除一列范围。此时,
右上角元素为8,8>7。所以又消除一列。如下图
1 | 2 |
---|---|
2 | 4 |
4 | 7 |
6 | 8 |
我们继续从右上角分析: | |
2 < 7,因为从左到右递增。所以7不可能存在于这一行了。可以消除一行。利用这一点,我们可以看到下图 | |
4 | 7 |
---- | ---- |
6 | 8 |
这样,我们就可以成功查找到7了。 | |
总结 |
- 1 从右上角元素cur开始分析
- 如果cur == target,那么查找成功,返回true
- 如果cur < target , 那么消除这一行,返回步骤 1 继续
- 如果cur > target ,那么消除这一列,返回步骤 1 继续
- 返回false,没有找到
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if(m == 0 || matrix[0].size()==0){ //检查边界情况
return false;
}
int n = matrix[0].size();
int x,y;
x = 0;y=n-1; //指针指向右上角
while(x<m&&y>=0){
if(matrix[x][y] == target){
return true;
}else if(matrix[x][y] > target){
--y;
}else if(matrix[x][y] < target){
++x;
}
}
return false;
}
};