暴力查找
-
时间复杂度:O(mn)。
-
空间复杂度:O(1)。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for(const auto& row:matrix){
for(int element:row){
if(element==target){
return true;
}
}
}
return false;
}
};
二分查找
对每一行都使用一次二分查找
- 时间复杂度:O(mlogn)O(m \log n)O(mlogn)。对一行使用二分查找的时间复杂度为 O(logn)O(\log n)O(logn),最多需要进行 mmm 次二分查找。
- 空间复杂度:O(1)O(1)O(1)。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
for(const auto& row:matrix){
//返回第一个大于等于target的元素位置
//若不存在这样的元素,则it返回eow.end()
auto it=lower_bound(row.begin(),row.end(),target);
//避免越界访问,引发未定义行为
if(it!=row.end()&&*it==target){
return true;
}
}
return false;
}
};
为什么不能直接判断*it==target:避免越界访问
Z字形查找
从右上角开始移动
- 时间复杂度:O(m+n)。
- 空间复杂度:O(1)。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m=matrix.size(),n=matrix[0].size();
int x=0,y=n-1;
while(x<m&&y>=0){
if(matrix[x][y]==target){
return true;
}
if(matrix[x][y]>target){
y--;
}
else{
x++;
}
}
return false;
}
};