/**
* Index: 74
* Title: Search a 2D Matrix
* Author: ltree98
**/
题意
在m*n的矩阵中寻找是否存在某个数。
- 每行整数都是由小到大排序的
- 每行第一个数都大于上一行最后一个数
我的
思路
顺序查找
每次先与每行最后一个数比较,直到目标值小于最后数,则该数肯定在此行;再从该行从头比较。
时间复杂度:O(m+n)
空间复杂度:O(1)
二分
这个矩阵两个顺序条件一列,明显就是有序数组,可以用二分来进行解决。
要注意中间值对应的行列值关系。
时间复杂度:O(log(m*n))
空间复杂度:O(1)
实现
顺序查找
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty())
return false;
int row = matrix.size();
int col = matrix[0].size();
int i = 0;
while(i < row-1) {
if(target == matrix[i][col-1])
return true;
else if(target < matrix[i][col-1]) {
break;
}
++i;
}
for(int j = 0; j < col; j++) {
if(target == matrix[i][j])
return true;
}
return false;
}
};
二分查找
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty())
return false;
int row = matrix.size();
int col = matrix[0].size();
int n = row * col;
int l = 0, h = n - 1;
while (l <= h){
int m = (l + h) / 2;
if (matrix[m / col][m % col] < target)
l = m + 1;
else if(matrix[m / col][m % col] > target)
h = m - 1;
else
return true;
}
return false;
}
};