解法1:
以第一行最后一列作为标尺,与目标之进行比较,根据结果删除第一行或者最后一列。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
for(int r = 0, c = n-1; (r < m) && (c >= 0);){
if(matrix[r][c] > target){
c--;
}else if(matrix[r][c] < target){
r++;
}else return true;
}
return false;
}
};
解法2:
分治:取“中心”点
class Solution {
public:
bool find(vector<vector<int>>& a, int x1, int y1, int x2, int y2, int target){
if((x1 > x2) || (y1 > y2)) return false;
int midx = (x1 + x2) >> 1;
int midy = (y1 + y2) >> 2;
if(a[midx][midy] == target) return true;
return (a[midx][midy] < target)?
(find (a, x1, midy + 1, x2, y2, target) || find(a,midx + 1, y1, x2, midy, target)):
(find (a, x1, y1, x2, midy -1, target) || find(a, x1, midy, midx -1, y2, target));
}
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size(), n = matrix[0].size();
return find(matrix, 0, 0, m - 1, n - 1, target);
}
};