原题链接:搜索二维矩阵 II
个人解法
思路:
因为每一行每一列都是升序的,故一种直观的方法就是遍历每一行,对每一行进行一个二分搜索。
时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm)
代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int n = matrix.size(), m = matrix[0].size();
for(int i = 0;i < n;i ++) {
auto &v = matrix[i];
int l = 0, r = m - 1;
while(l <= r) {
int mid = (l + r) >> 1;
if(v[mid] == target) return true;
if(v[mid] > target) r = mid - 1;
if(v[mid] < target) l = mid + 1;
}
}
return false;
}
};
更好的解法
思路:
我们取右上角的值为起始遍历的点进行比较,为什么取右上角的值?
因为行和列都是升序排列的,那么右上角为它所在行的最大值,为它所在列的最小值
故如果target小于当前值,意味着它所在列的值都比target值大,故可以直接舍弃一列。
如果target大于当前值,意味着它所在行的值都比target小,故可以直接舍弃一行。
这样知道找到target或越界表示没找到。
时间复杂度: O ( n + m ) O(n + m) O(n+m)
代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int n = matrix.size(), m = matrix[0].size();
int x = 0, y = m - 1;
while(x < n && y >= 0) {
if(matrix[x][y] == target) return true;
if(matrix[x][y] < target) x ++;
else y --;
}
return false;
}
};