链接: link.
本题我们可以用两种方法做。
双指针法
因为矩阵是从左到右递增,从上倒下递增,所以一开始我们选中右上角的位置,根据当前位置的值和key值的大小挪动我们的指针,直到找到key值或者找完所有满足条件的位置。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()||matrix[0].empty()) return false;
int i = 0,j = matrix[0].size()-1;
while(i<matrix.size()&&j>=0)
{
if(matrix[i][j]==target) return true;
if(matrix[i][j]<target) i++;
else j--;
}
return false;
}
};
二分法
我们可以将这个二维矩阵看成一维数组,然后进行二分查找即可。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty()||matrix[0].empty()) return false;
int n = matrix.size(),m = matrix[0].size();
int l = 0,r = n*m-1;
while(l<r)
{
int mid = (l+r)/2;
if(matrix[mid/m][mid%m]>=target) r = mid;
else l = mid+1;
}
return matrix[r/m][r%m] == target;
}
};