java实现:
具体思路:
从二维数组的右上角开始查找。如果当前元素的值等于目标值,则返回 true。如果当前元素大于目标值,则向左移。如果当前元素小于目标值,则向下移。
我们来这种方法不会错过目标值。
如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。
如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
选左上角,往右走和往下走都增大,不能选
选右下角,往上走和往左走都减小,不能选
选左下角,往右走增大,往上走减小,可选
选右上角,往下走增大,往左走减小,可选
时间复杂度:O(n+m)O(n+m)。访问到的下标的行最多递增 n 次,列最多递减 m 次,最多从右上角访问到左下角,因此循环体最多执行 n + m 次。
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length==0)return false;
int m=matrix.length,n=matrix[0].length;
int i=0,j=n-1;
while(i<m&&j>=0){
if(matrix[i][j]==target)return true;
else if(matrix[i][j]<target)i++;
else j--;
}
return false;
}
}
C++实现只需要吧length函数改成size()即可