这个题目有一个技巧,从矩阵的右上角开始看,会发现是一课二叉搜索树,左边比根节点小,右边比根节点大,所以就比较简单了,直接在次函数内解决或者写一个函数外部递归调用。两个是消耗都差不多。
if (matrix.size() == 0 || matrix[0].size() == 0) {
return false;
}
int i=0;
int j=matrix[0].size()-1;
while(i<matrix.size()&&j>=0)
{
if(matrix[i][j]==target) return true;
else if(matrix[i][j]>target) j--;
else i++;
}
return false;
bool search(vector<vector<int>>& matrix, int target,int i,int j)
{
if(i==matrix.size()||j<0) return false;
if(target==matrix[i][j]) return true;
if(target<matrix[i][j]) { return search(matrix,target,i,j-1);}
else { return search(matrix,target,i+1,j);}
}
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0||matrix[0].size()==0) return false;
int i=0;
int j=matrix[0].size()-1;
return search(matrix,target,i,j);
}
时间复杂度 O(M+N)O(M+N) :其中,NN 和 MM 分别为矩阵行数和列数,此算法最多循环 M+NM+N 次。
空间复杂度 O(1)O(1) : i, j 指针使用常数大小额外空间。