841. 钥匙和房间
题目:
思路:
【1】这道题说是中等但是感觉偏简单,也就是要遍历传入数组的全部元素,同时还要注意如何防止出现死循环的可能即可。
代码展示:
//深度遍历 //时间0 ms 击败 100% //内存42.1 MB 击败 28.26% 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){ // 防止重复进入,有死循环的可能 if (vis[x]) return; vis[x] = true; num++; for(int i : rooms.get(x)){ if(!vis[i]){ dfs(rooms,i); } } } } //广度遍历 //时间1 ms 击败 60.91% //内存42.2 MB 击败 11.25% class Solution { public boolean canVisitAllRooms(List<List<Integer>> rooms) { // 获取房间的个数 int roomNum = rooms.size(); // 初始化房间的开门状态 boolean[] roomStatus = new boolean[roomNum]; roomStatus[0] = true; roomNum--; // 持有的钥匙集合(因为房间0默认是无锁的) Queue<Integer> queue = new LinkedList<Integer>(rooms.get(0)); while (!queue.isEmpty()){ int key = queue.poll(); // 如果没有打开则去打开并且获取里面的钥匙 if (!roomStatus[key]) { roomStatus[key] = true; queue.addAll(rooms.get(key)); // 未打开的房间数要减1 roomNum--; } } // 如果全部打开了则未打开的房间数应该是0 return roomNum == 0; } }