搜索二维矩阵
- 描述
- 写出一个高效的算法来搜索 m × n矩阵中的值。
- 这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每行的第一个数大于上一行的最后一个整数。
- 思路
- 分别对矩阵的行和矩阵的列使用二分搜索
- 解法一
class Solution {
public:
/**
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int>> &matrix, int target) {
// write your code here
int left = 0;
int right = matrix.size()-1;
while(left+1<right){
int mid = left + (right-left) / 2;
if(matrix[mid][0]>target){
right = mid;
}
else if(matrix[mid][0]<=target){
left = mid;
}
}
int index;
if(matrix[left][0]>target) return false;
else if(matrix[left][0]<=target && matrix[right][0]>target) index = left;
else index = right;
left = 0;
right = matrix[index].size()-1;
while(left+1<right){
int mid = left + (right-left) / 2;
if(matrix[index][mid]>target){
right = mid;
}
else if(matrix[index][mid]<target){
left = mid;
}
else return true;
}
if(matrix[index][left]==target||matrix[index][right]==target) return true;
return false;
}
};
- 解法二
class Solution {
public:
/**
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int>> &matrix, int target) {
// write your code here
int left = 0;
int right = matrix.size()-1;
while(left<=right){
int mid = left + (right-left) / 2;
if(matrix[mid][0]>target){
right = mid-1;
}
else if(matrix[mid][0]<target){
left = mid + 1;
}
else return true;
}
int index = (right>=0)? right : (right+1);
left = 0;
right = matrix[index].size()-1;
while(left<=right){
int mid = left + (right-left) / 2;
if(matrix[index][mid]>target){
right = mid-1;
}
else if(matrix[index][mid]<target){
left = mid+1;
}
else return true;
}
return false;
}
};