编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
暴力:
时间复杂度O(M*N)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int r_len = matrix.size();
for(int i = 0;i<r_len;i++){
for(int j = 0;j<matrix[i].size();){
if(matrix[i][j] < target){
j++;
}else if(matrix[i][j] == target){
return true;
}else{
break;
}
}
}
return false;
}
};
没有利用矩阵的特性,即每行的元素从左到右升序排列,每列的元素从上到下升序排列。
因此,它的时间复杂度是O(m * n),超出时间限制。
要解决这个问题,首先,从矩阵的右上角开始,将其与目标值进行比较。
- 如果目标值小于当前元素,则说明目标值在当前元素的左侧列中,可以将列索引减1;
- 如果目标值大于当前元素,则说明目标值在当前元素的下方行中,可以将行索引加1。
通过不断地缩小搜索范围,最终可以找到目标值或确定目标值不存在。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int i = matrix.size() - 1, j = 0;
while(i >= 0 && j < matrix[0].size())
{
if(matrix[i][j] > target) i--;
else if(matrix[i][j] < target) j++;
else return true;
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int r_len = matrix.size();
int c_len = matrix[0].size();
int row = 0;
int col = c_len - 1;
while(row < r_len && col >= 0){
if(matrix[row][col] == target){
return true;
}
else if(matrix[row][col] < target){
row++;
}
else{
col--;
}
}
return false;
}
};