class Solution {
public://先找行,再找列 时间复杂度O(logn + logm)
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int i = row(matrix,target);
if(i == -1)
return false;
bool res = find(matrix[i],target);
return res;
}
int row(vector<vector<int> > &matrix,int target){
int n = matrix.size();
int first = 0,end = n - 1,mid;
while(first <= end){
mid = (first + end)/2;
if(matrix[mid][0] <= target){
if((mid < n - 1 && target < matrix[mid + 1][0]) || mid == n - 1)
return mid;
else
first = mid + 1;
}
else if(matrix[mid][0] > target)
end = mid - 1;
}
return -1;
}
bool find(vector<int> &A,int target){
int n = A.size();
int first = 0,end = n - 1,mid;
while(first <= end){
mid = (first + end)/2;
if(A[mid] == target)
return true;
else if(A[mid] > target)
end = mid - 1;
else
first = mid + 1;
}
return false;
}
};
方法2:
class Solution {
public://时间复杂度O(n + m)
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int i = 0, j = matrix[0].size() - 1;
while (i < matrix.size() && j >= 0)
{
if (target == matrix[i][j])
return true;
else if (target < matrix[i][j])
j--;
else
i++;
}
return false;
}
};关于此问题的讨论 http://leetcode.com/2010/10/searching-2d-sorted-matrix.html
二维有序矩阵搜索算法
本文介绍两种在二维有序矩阵中查找特定元素的方法。第一种方法采用分治思想,通过二分查找确定目标值可能所在的行,然后在该行内进行二分查找,时间复杂度为O(logn+logm)。第二种方法从矩阵右上角开始,根据目标值与当前值比较的结果调整搜索方向,时间复杂度为O(n+m)。
271

被折叠的 条评论
为什么被折叠?



