剑指offer04——二维数组中的查找(搜索二维矩阵)
作者:互联网
剑指offer04——二维数组中的查找(搜索二维矩阵):思路分享
首先分析一下题目:
有一个很有个性的二维数组:每行从左到右递增,每列从上到下递增。然后给你一个数,让你去矩阵里面找有没有这个数。
思路:
乍一看这个题目,大部分同学会想到暴力破解,这样可以说是毫无含金量,那题目还给你这么多条件干啥?
因此,我们再次观察矩阵,发现两个特殊的位置:左下角、右上角
以右上角为例,设为flag:它所在的行都比他小,而它所在的列都比他大,如果我们获取到它的值,通过与target对比,一次就能干掉一行或者一列的数!
- 如果
target > flag
,那么第一行就都干掉了,因为他们都太小,也就是横坐标++ - 如果
target < flag
,那么最后一列就都干掉了,因为他们都太大,也就是纵坐标- -
依此类推,我们只需要设计好循环终止的条件,一旦跳出循环返回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