每一列递增,每一行递增
在每一行中二分即可
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0 || matrix[0].size() == 0) return false;
for(auto &it:matrix){
int l=0,r=it.size()-1;
while(l<r){
int mid=(l+r+1)>>1;
if(it[mid]<=target) l=mid;
else r=mid-1;
}
if(it[l]==target) return true;
}
return false;
}
从数组的右上角开始搜
设当前数为m
如果m>target, 我们就向左搜
如果m<target, 我们就向下搜
如果m=taget, 那答案不就来了吗
为什么这样可以得到结果呢?
如果m>target, 我们向右/向下m都会越来越大,所以要么向上要么向左, 但我们就是从上边下来的啊,怎么可能还向上呢? 因此向左走
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(!matrix.size()||!matrix[0].size()) return false;
int x=0,y=matrix[0].size()-1;
while(x<matrix.size()&&y>=0){
int m=matrix[x][y];
if(m<target) {
x++;
}else if(m>target){
y--;
}else return 1;
}
return false;
}
};