题意:给定一个元素按序排列的矩阵,判断某个元素是否在其中。
思路:两次二分搜索,先搜索列,再搜索行。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0) return false;
if(target < matrix[0][0]) return false;
if(target == matrix[0][0]) return true;
int low = 0;
int high = matrix.size() - 1;
if(matrix[low][0] == target || matrix[high][0] == target) return true;
while(high - low > 1) {
if(matrix[low][0] == target || matrix[high][0] == target) return true;
int mid = low + (high -low) / 2;
if(matrix[mid][0] == target ) return true;
if(target < matrix[mid][0]) {
high = mid;
}
else {
low = mid;
}
}
int r = low;
if(matrix[high][0] < target) r = high;
low = 0;
high = matrix[r].size() - 1;
while(low != high) {
if(matrix[r][low] == target || matrix[r][high] == target) return true;
int mid = low + (high - low) / 2;
if(matrix[r][mid] == target) return true;
if(matrix[r][mid] < target) {
low = mid + 1;
}
else {
high = mid;
}
}
if(matrix[r][low] == target) return true;
return false;
}
};
另一种思路是把他当作一维二分查找做。
n * m matrix convert to an array => matrix[x][y] => a[x * m + y]
an array convert to n * m matrix => a[x] =>matrix[x / m][x % m];