题目
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/
分析
从右上角开始搜索。向左变小,向下变大。
向左数字会变小,向下数字会变大,有点和二分查找树相似。二分查找树的话,是向左数字变小,向右数字变大。
所以我们可以把 target 和当前值比较。
如果 target 的值大于当前值,那么就向下走。
如果 target 的值小于当前值,那么就向左走。
如果相等的话,直接返回 true 。
代码
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int m=matrix.length;
if(m==0)
return false;
int n=matrix[0].length;
int i=0;
int j=n-1;
while(i<m&&j>=0){
if(matrix[i][j]==target)
return true;
if(matrix[i][j]>target)
j--;
else
i++;
}
return false;
}
}
复杂度
时间复杂度O(m+n):由于行只能减少 m 次,而列只能增加 n 次,因此在导致 while 循环终止之前,循环不能运行超过 n+m 次。因为所有其他的工作都是常数,所以总的时间复杂度在矩阵维数之和中是线性的。
空间复杂度O(1)