前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。
我来分析一下,如果我们存放这个二维数组,那么空间复杂度就是O(n*m),但是target如果是在给出二维数组前就给出的话,这题就没啥意义了,所以咱不考虑空间O(1)的情况。
方法1:进阶解法
进阶:空间复杂度O(1),时间复杂度O(n+m)
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int N = matrix.size();
if(!N)return false; //不加这句话题目恶搞(输入为空)会出现执行错误
int M = matrix[0].size();
int i=0,j=M-1;
while(i<N&&j>=0){
if(matrix[i][j]==target)return true;
if(i<N-1&&matrix[i+1][j]<=target)i++;
else j--;
}
return false;
}
};
//要注意对于vector<>来说,元素过界会报错
这应该是最简单的O(n+m)的解,从右上角找一下就过了,从左下角找一下也行。
方法2:dfs深度优先搜索(递归)
class Solution {
public:
vector<vector<int>> m;
int t,a,b,bo[1001][1001];
//bo[][]防止同一个位置找了多次
bool dfs(int x,int y){
return (bo[x][y]++)?false:m[x][y]==t?true:(((x<a&&m[x+1][y]<=t)?dfs(x+1,y):false)||((y<b&&m[x][y+1]<=t)?dfs(x,y+1):false));
}
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int N = matrix.size();
if(!N)return false;
int M = matrix[0].size();
if(!M)return false;
m = matrix,t = target,a = N-1,b = M-1;
return dfs(0,0);
}
};
建议在阅读的时候把dfs语句拆开来看。
方法3:bfs广度优先搜索
class Solution {
public:
bool bo[1001][1001];
int n,m,t,t1,t2,T1[1000001],T2[1000001];
vector<vector<int>> a;
bool bfs(int x,int y){
if(t1++>t2)return false;
if(bo[x][y])return bfs(T1[t1],T2[t1]);
bo[x][y]=1;
//防止重复
if(a[x][y]==t)return true;
if(a[x][y]>t)return bfs(T1[t1],T2[t1]);
if(x<n)T1[++t2]=x+1,T2[t2]=y;
if(y<m)T1[++t2]=x,T2[t2]=y+1;
return bfs(T1[t1],T2[t1]);
}
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
int N = matrix.size();
if(!N)return false;
int M = matrix[0].size();
if(!M)return false;
a = matrix,n = N-1,m = M-1,t = target;
return bfs(0,0);
}
};
建议大家用学习一下链表再写用bfs解这道题。