841. 钥匙和房间

原题链接:

841. 钥匙和房间

https://leetcode.cn/problems/keys-and-rooms/description/

完成情况:

在这里插入图片描述

解题思路:

这段代码是一个解决问题的类,其中包含了一个私有方法dfs和一个公共方法canVisitAllRooms。dfs方法使用深度优先搜索(DFS)算法来遍历房间,同时记录哪些房间被访问过。canVisitAllRooms方法则调用dfs方法来检查是否可以访问所有房间。

具体解释如下:

  • dfs方法接收一个键值key、房间列表rooms和访问状态列表visited作为参数。如果当前房间已经被访问过,则直接返回;否则标记当前房间为已访问,并递归地对当前房间可以到达的房间进行深度优先搜索。
  • canVisitAllRooms方法接收一个房间列表rooms作为参数。首先创建一个与房间数量相同的访问状态列表visited,并调用dfs方法从第一个房间开始遍历。最后检查visited列表中是否所有房间都被访问过,若有未被访问的房间则返回false,否则返回true。

这段代码的主要功能是使用DFS算法来检查是否可以访问所有的房间,通过标记访问状态来避免重复访问,并最终返回一个布尔值表示是否可以访问所有房间。

参考代码:

_841钥匙和房间_dfs

package 代码随想录.图论;

import java.util.ArrayList;
import java.util.List;

public class _841钥匙和房间_dfs {
    /**
     * 房间编号从0开始计算 ,每个List<Integer>存储一个集合,集合里表示能去的所有方便
     * @param rooms
     * @return
     */
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        //dfs,看看能不能遍历到所有的节点即可。
        //先构造一个visited数组用来最后判别是否能访问到所有的节点
        List<Boolean> visited = new ArrayList<Boolean>(){{
            //并为里面rooms.size()尺寸赋值全false
            for (int i = 0; i < rooms.size();i++) {
                add(false);
            }
        }};
        dfs_canVisitAllRooms(0,rooms,visited);
        //检查是否都访问到了
        for (boolean flag : visited){
            if (!flag){
                return false;
            }
        }
        return true;
    }

    private void dfs_canVisitAllRooms(int idx_key, List<List<Integer>> rooms, List<Boolean> visited) {
        if (visited.get(idx_key)){
            return;
        }
        visited.set(idx_key,true);
        for (int k : rooms.get(idx_key)){
            //递归
            dfs_canVisitAllRooms(k,rooms,visited);
        }
    }
}

_841钥匙和房间_bfs

package 代码随想录.图论;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;

public class _841钥匙和房间_bfs {
    /**
     * 房间编号从0开始计算 ,每个List<Integer>存储一个集合,集合里表示能去的所有方便
     * @param rooms
     * @return
     */
    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        //先构造一个visited数组用来最后判别是否能访问到所有的节点
        boolean visited [] = new boolean[rooms.size()];
        visited[0] = true;
        Deque<Integer> queueList = new ArrayDeque<Integer>();
        queueList.add(0);   //加入一号房间
        while (!queueList.isEmpty()){
            //遍历,并不断加入新的节点
            int curNode_Key = queueList.poll();
            //再去对应位置获取所有的元素加入queueList,然后进行判断,然后迭代
            for (int key : rooms.get(curNode_Key)){
                if (visited[key])   continue;
                visited[key] = true;
                queueList.add(key);
            }
        }
        for (boolean key_visit : visited){
            if (!key_visit) return false;
        }
        return true;
    }
}

错误经验吸取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值