题目:https://leetcode-cn.com/problems/keys-and-rooms/
代码:
class Solution { public boolean canVisitAllRooms(List<List<Integer>> rooms) { //访问过的房间数组,下标代表房间号,值为true代表访问过 boolean[] visit = new boolean[rooms.size()]; //当前拥有的钥匙 Stack<Integer> myKeys = new Stack<>(); myKeys.push(0); //只要还有钥匙就去开房间 while (!myKeys.isEmpty()) { Integer key = myKeys.pop(); if (!visit[key]) { //房间没开过,取得房间内的钥匙,并标记当前房间被访问过 myKeys.addAll(rooms.get(key)); visit[key] = true; } } //根据题目要求,只要有一间房间没有访问过,就返回false for (int i = 0; i < visit.length; i++) { if (!visit[i]) { return false; } } return true; } }
按照题目描述,定义一个boolean类型的数组visit代表房间的访问情况,然后定义一个栈myKeys来保存当前拥有的钥匙,只要还有钥匙就去开房间,开完就把钥匙丢弃,开完房间之后获取房间内的所有钥匙,并继续开门直到无钥匙可开。最终通过visit数组判断结果是true还是false。