其他分享
首页 > 其他分享> > 剑指offer04——二维数组中的查找(搜索二维矩阵)

剑指offer04——二维数组中的查找(搜索二维矩阵)

作者:互联网

剑指offer04——二维数组中的查找(搜索二维矩阵):思路分享

图片来自力扣
首先分析一下题目:

有一个很有个性的二维数组:每行从左到右递增,每列从上到下递增。然后给你一个数,让你去矩阵里面找有没有这个数。

思路:

乍一看这个题目,大部分同学会想到暴力破解,这样可以说是毫无含金量,那题目还给你这么多条件干啥?

因此,我们再次观察矩阵,发现两个特殊的位置左下角、右上角

以右上角为例,设为flag:它所在的行都比他小,而它所在的列都比他大,如果我们获取到它的值,通过与target对比,一次就能干掉一行或者一列的数!

依此类推,我们只需要设计好循环终止的条件,一旦跳出循环返回false即可。

这种方法的空间复杂度是O(1),时间复杂度是O(m+n),引用官方的解释

访问到的下标的行最多增加 n 次,列最多减少 m 次,因此循环体最多执行 n + m 次。

代码如下:

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
    //思路:找到左下角或者右上角,这里我们选择左下角
    //因为从右下角开始会出现越界问题(一旦输入数组为空,则不存在j)
        int i=matrix.length-1, j=0;
        while(i>=0 && j<matrix[i].length) {
            if(target>matrix[i][j]) {
                j++;
            } else if(target<matrix[i][j]) {
                i--;
            } else {
                return true;
            }
        }
        return false;
    }
}

最后,看到力扣的解释不错:如果把矩阵逆时针旋转45度,可以看成是BST,和根节点比较,直接舍去半棵树,这样理解起来会方便很多

标签:target,矩阵,flag,offer04,二维,查找,左下角,matrix
来源: https://blog.csdn.net/weixin_43191250/article/details/112108680