【问题描述】[中等]

【解答思路】

当 xx 号房间中有 yy 号房间的钥匙时,我们就可以从 xx 号房间去往 yy 号房间。如果我们将这 nn 个房间看成有向图中的 nn 个节点,那么上述关系就可以看作是图中的 xx 号点到 yy 号点的一条有向边。

这样一来,问题就变成了给定一张有向图,询问从 00 号节点出发是否能够到达所有的节点。

用visit数组或者Set记录已经访问的节点

1. DFS

使用深度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 vis 标记当前节点是否访问过,以防止重复访问。
复杂度

class Solution {boolean[] vis;int num;public boolean canVisitAllRooms(List<List<Integer>> rooms) {int n = rooms.size();num = 0;vis = new boolean[n];dfs(rooms, 0);return num == n;}public void dfs(List<List<Integer>> rooms, int x) {vis[x] = true;num++;for (int it : rooms.get(x)) {if (!vis[it]) {dfs(rooms, it);}}}
}
2. BFS

用广度优先搜索的方式遍历整张图,统计可以到达的节点个数,并利用数组 vis /Set标记当前节点是否访问过,以防止重复访问。
复杂度

class Solution {public boolean canVisitAllRooms(List<List<Integer>> rooms) {int n = rooms.size(), num = 0;boolean[] vis = new boolean[n];Queue<Integer> que = new LinkedList<Integer>();vis[0] = true;que.offer(0);while (!que.isEmpty()) {int x = que.poll();num++;for (int it : rooms.get(x)) {if (!vis[it]) {vis[it] = true;que.offer(it);}}}return num == n;}
}
 public boolean canVisitAllRooms(List<List<Integer>> rooms) {Stack<Integer> a = new Stack<>();HashSet<Integer> set = new HashSet<Integer>();set.add(0);a.add(0);while(!a.isEmpty()){int i =a.pop();for(int j:rooms.get(i)){if(!set.contains(j)){a.add(j);set.add(j);if (rooms.size() == set.size()) return true;}}}return (rooms.size() == set.size()) ;}

【总结】

1. DFS 递归回溯 BFS 队列
2.审题!!! 思考后再行动

转载链接:https://leetcode-cn.com/problems/keys-and-rooms/solution/yao-chi-he-fang-jian-by-leetcode-solution/

[Leetcode][第841题][JAVA][钥匙和房间][DFS][BFS]相关推荐

  1. [Leetcode][第404题][JAVA][左叶子之和][DFS][BFS]

    [问题描述][简单] [解答思路] 1. DFS 递进思想 一步一步递进 /先序遍历求所有节点值之和 public int sumOfTrees(TreeNode root) {if (root == ...

  2. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  3. [Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

    [问题描述][简单] [解答思路] 1. 递归 终止条件/基本情况 root ==null 递推关系 max(l,r)+1 时间复杂度:O(N) 空间复杂度:O(height) class Solut ...

  4. [Leetcode][第207题][JAVA][课程表][拓扑排序][DFS]

    [问题描述][中等] [解答思路] 1. 拓扑排序 复杂度分析 HashSet[] 数组 import java.util.HashSet; import java.util.LinkedList; ...

  5. [Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]

    [问题描述][简单] [解答思路] 1. DFS 时间复杂度:O(N^2) 空间复杂度:O(N^2) class Solution {public List<String> binaryT ...

  6. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  7. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  8. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  9. [Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

    [问题描述][简单] [解答思路] 1. 递归 自下而上 基本情况/结束条件 : 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时,返回 1 当 roo ...

最新文章

  1. Python+selenium自动化:页面加载慢、超时加载情况下内容已经加载完毕的快速执行脚本解决方案,页面加载时间过长优化方案
  2. MLPrimitive如何添加自定义的Primitive
  3. 第四范式团队KDD Cup世界冠军方案详解:解密共享出行场景中的优化问题
  4. GMQ稳定币为区块链资产在金融市场的进一步应用打开了一扇大门
  5. java获取多线程执行结果几种方式小结
  6. java 递归_两篇文章带你了解java基础算法之递归和折半查找
  7. elementUI中table中自定义修改时间格式2020-10-26T10:00:00
  8. 基于javaweb+JSP+Servlet火车票网上订票系统(前台、后台)
  9. CSM300调试心得
  10. 在Vue中使用高德地图
  11. spring Boot 2 基础篇 。内含 整合一个spring boot 的 小案例
  12. android 局域网 发现,局域网内android设备发现及通讯
  13. 零距离接触阿里云时序时空数据库TSDB
  14. HDU 5914 - Triangle
  15. java贪心,java实现贪心算法
  16. jquery mouse事件小坑
  17. 影视公司触网意在大数据
  18. uva714-复制书稿
  19. 什么是G.654E光纤?
  20. Shell脚本语法3.21

热门文章

  1. 设计模式6大原则简述
  2. openoffice转换过程中遇到繁体字文档转换失败的问题
  3. java连接u盘_虚拟机VM6.0 LINUX redhat 挂接U盘,访问U盘
  4. Asp.Net微信发布菜单,出现“invalid sub button url domain hint”错误
  5. 01-Flutter移动电商实战-项目学习记录
  6. Android 获取短信验证码,自动填充
  7. mpvue 从零开始 女友初成长 0
  8. 北大“四大疯人院”之说
  9. angular html清除元素,在Angular js中单击时删除HTML元素
  10. 文件读写的“二进制模式”和“文本模式”