剑指 Offer 04. 二维数组中的查找

剑指 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;
    }
};
posted @ 2021-03-01 17:11  focusDing  阅读(53)  评论(0编辑  收藏  举报