/*本题也是二分搜索的变种。这里的思路是:
1.首先将搜索范围限制到一个左上角区域;
2.然后对每一行进行二分搜索查找目标。
注:当某一行最右边的数字都小于target时,不进行搜索,这里可以降低时间消耗。*/
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m(matrix.size()-1), n(matrix[0].size()-1);
//确定左上角区域为搜索区域
while(m >= 0 && matrix[m][0] > target) --m;
while(n >= 0 && matrix[0][n] > target) --n;
//然后根据划分出来的每一行进行搜索
for(int i = 0; i < m+1; ++i){
if(matrix[i][n] < target) continue;
//二分查找每一行
int left(0), right(n);
while(left <= right){
int mid = (left+right)/2;
if(matrix[i][mid] == target) return true;
else if(matrix[i][mid] > target) right = mid-1;
else left = mid+1;
}
}
return false;
}
};
LeetCode之Search a 2D Matrix
最新推荐文章于 2020-11-18 14:30:06 发布