方法一:直接搜索
这个方法是从矩阵的左上角开始,分别从左上角元素向右向下搜索,时间复杂度为O(n^2)
,这个方法比较直观但是使用时间过长。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0 || matrix[0].size()==0) return false;
return searchMatrixRow(matrix, 0, 0, target);
}
private:
bool searchMatrixRow(vector<vector<int>>& matrix, int row, int column, int target){
if(row>matrix.size()-1 || column>matrix[0].size()-1) return false;
if(matrix[row][column]==target) return true;
else if(matrix[row][column]>target) return false;
int a = searchMatrixRow(matrix, row+1, column, target);
int b = searchMatrixRow(matrix, row, column+1, target);
return a || b;
}
};
方法二
设定搜索的起始点为右上角或者左下角,这样不会出现像 方法一 那样向下和向右均是数值增加的方向,例如起始点在右上角时,若该点的数值大于目标点,则向左移动;若小于目标点,则向下移动;若等于目标点,则返回真。这个方法的时间复杂度为O(n)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0 || matrix[0].size()==0) return false;
int m = matrix.size(), n = matrix[0].size()-1, row = 0;
while(true){
if(n<0 || row>m-1) return false;
if(matrix[row][n]>target) n--;
else if(matrix[row][n]==target) return true;
else row++;
};
}
};