【算法与数据结构】841、LeetCode钥匙和房间

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解

一、题目

在这里插入图片描述

二、解法

  思路分析:之前的岛屿问题可以看做是无向图,因为所有连接陆地都是互通的。而本题是一个有向图,即使节点之间是连接的,也未必能进入所有的房间。以[[5], [], [1, 3], [5]]为例,从0房间开始出发,到了5房间以后哪里也去不了。因此本是一个有向图全路径搜索的问题,可以用深搜或广搜来解决。

  程序如下

class Solution {
private:
	void dfs(vector<vector<int>>& rooms, vector<bool>& visitRooms, int key) {	// 1、递归输入参数		
		// 2、递归终止条件 访问过的节点直接返回
		if (visitRooms[key]) return;
		// 3、单层递归逻辑	
		visitRooms[key] = true;
		for (int i = 0; i < rooms[key].size(); i++) {
			dfs(rooms, visitRooms, rooms[key][i]);
		}	
	}
public:
	bool canVisitAllRooms(vector<vector<int>>& rooms) {
		vector<bool> visitRooms = vector<bool>(rooms.size(), false);
		dfs(rooms, visitRooms, 0);
		for (int i = 0; i < visitRooms.size(); i++) {
			if (!visitRooms[i]) return false;
		}
		return true;
	}
};

复杂度分析:

  • 时间复杂度: O ( n + m ) O(n+m) O(n+m),其中 n n n是房间的数量, m m m是所有房间中的钥匙数量的总数。
  • 空间复杂度: O ( n ) O(n) O(n),主要为栈的开销。

三、完整代码

# include <iostream>
# include <vector>
using namespace std;

class Solution {
private:
	void dfs(vector<vector<int>>& rooms, vector<bool>& visitRooms, int key) {	// 1、递归输入参数		
		// 2、递归终止条件 访问过的节点直接返回
		if (visitRooms[key]) return;
		// 3、单层递归逻辑	
		visitRooms[key] = true;
		for (int i = 0; i < rooms[key].size(); i++) {
			dfs(rooms, visitRooms, rooms[key][i]);
		}	
	}
public:
	bool canVisitAllRooms(vector<vector<int>>& rooms) {
		vector<bool> visitRooms = vector<bool>(rooms.size(), false);
		dfs(rooms, visitRooms, 0);
		for (int i = 0; i < visitRooms.size(); i++) {
			if (!visitRooms[i]) return false;
		}
		return true;
	}
};

int main() {
	vector<vector<int>> rooms = { {1}, {2}, {3}, {} };
	vector<vector<int>> rooms = { {1, 3}, {3, 0, 1}, {2}, {0} };
	//vector<vector<int>> rooms = { {2, 3}, {}, {2}, {1, 3} };
	Solution s1;
	int result = s1.canVisitAllRooms(rooms);
	cout << result << endl;
	system("pause");
	return 0;
}

end

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚安66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值