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;
    }
}

 

posted @ 2023-07-24 11:58  忧愁的chafry  阅读(4)  评论(0编辑  收藏  举报