社团活动每日一题:第四天 二维数组的查找

本文介绍了三种在二维数组中查找目标值的方法,包括空间复杂度为O(1)的进阶解法、DFS深度优先搜索和BFS广度优先搜索。每种方法的时间复杂度为O(n+m),并提供了相应的C++代码实现。通过这些方法,可以在给定的二维数组中高效地找到目标值的位置或确认其不存在。
摘要由CSDN通过智能技术生成

前言:这是我们大学社团给我们大一新生布置的每日一题任务,因为本人编程理解有限,参考价值较低。

题目链接

我来分析一下,如果我们存放这个二维数组,那么空间复杂度就是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解这道题。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值