思考过程:
从房间0开始,bfs,然后判断是否走完所有的房间。
代码实现:
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
Set<Integer> history = new HashSet<>();
bfs(rooms, history, 0);
return history.size() == rooms.size();
}
public void bfs(List<List<Integer>> rooms, Set<Integer> history, int room) {
if (!history.contains(room)) {
history.add(room);
List<Integer> list = rooms.get(room);
for (int i : list) {
bfs(rooms, history, i);
}
}
}
执行结果:
算法复杂度分析:
时间复杂度:O(n)。
空间复杂度:O(n)。
(官方提供的复杂度分析,更加准确)
时间复杂度:O(n+m),其中 n 是房间的数量,m 是所有房间中的钥匙数量的总数。
空间复杂度:O(n),其中 n 是房间的数量。主要为队列的开销。
官方提供了dfs和bfs两种解法。都比较好理解。
总结:
今天这道题是比较典型的dfs和bfs类算法题,思路也比较简单明了。
周末两天,只有一天的每日一题完成了,而且都都没有写博客,罪孽深重。。。