1、每行使用二分查找
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
for (int i = 0; i < array.size(); i++) {
int low = 0;
int high = array[i].size();
while (low <= high) {
int mid = (low + high)/2-1; //需要减1,否则数组越界,数组6个,最后下标为5,恰好最后一个则a[6]
if (array[i][mid] == target) {
return true;
}
else if (array[i][mid] < target) {
low = mid + 1;
}
else {
high = mid - 1;
}
// mid=(low+high)/2;
}
}
return false;
}
};
2、使用数组特性,对角线,左上小,右下大
右上角m开始,比m小,列col减1,比m大,行row加1
左下角n开始,比n小,行row减1,比m大,列col加1
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row=0;
int col=array[0].size()-1;
while(row<array.size() && col>=0){
if(array[row][col]==target){
return true;
}
else if(array[row][col]>target){
col--;
}
else{
row++;
}
}
return false;
}
};