LeetCode 841:钥匙和房间 Keys and Rooms

2023-11-09

题目:

​ 有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。

​ 在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j][0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。

最初,除 0 号房间外的其余所有房间都被锁住。

你可以自由地在房间之间来回走动。

如果能进入每个房间返回 true,否则返回 false

​ There are N rooms and you start in room 0. Each room has a distinct number in 0, 1, 2, ..., N-1, and each room may have some keys to access the next room.

​ Formally, each room i has a list of keys rooms[i], and each key rooms[i][j] is an integer in [0, 1, ..., N-1] where N = rooms.length. A key rooms[i][j] = v opens the room with number v.

Initially, all the rooms start locked (except for room 0).

You can walk back and forth between rooms freely.

Return true if and only if you can enter every room.

示例 1:

输入: [[1],[2],[3],[]]
输出: true
解释:  
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。

示例 2:

输入:[[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。

提示:

  1. 1 <= rooms.length <= 1000
  2. 0 <= rooms[i].length <= 1000
  3. 所有房间中的钥匙数量总计不超过 3000

Note:

  1. 1 <= rooms.length <= 1000
  2. 0 <= rooms[i].length <= 1000
  3. The number of keys in all rooms combined is at most 3000.

解题思路:

​ 很简单的一道题,从0号房间开始递归遍历就可以了。唯一需要注意的是如何判断房间是否访问过。可以用set哈希表把已访问过的房间号记录下来,最后如果哈希表长度和rooms长度相等,那么就意味着所有房间均可到达。

代码:

Set集合(Java):

class Solution {
    Set<Integer> set = new LinkedHashSet<>();

    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        helper(rooms, 0);
        return set.size() == rooms.size();//长度相等则可以到达所有房间
    }

    private void helper(List<List<Integer>> rooms, int index) {
        if (set.contains(index)) return;
         set.add(index);//已访问房间号加入哈希表
        for (Integer i : rooms.get(index)) {//遍历房间的每一个钥匙
                helper(rooms, i);//进入递归
        }
    }
}

​ 可以看到用哈希表解题方法在递归期间会多出许多set函数的调用,如 set.add() 、set.contains(),相对很多这道题解题时间,这个开销是很大。对这道题而言,是完全可以用数组避免的。

Java:

class Solution {

    public boolean canVisitAllRooms(List<List<Integer>> rooms) {
        int len = rooms.size();
        int[] visited = new int[len];//初始化等长数组,数组每个值默认为0
        helper(rooms, 0, visited);
        for (int i : visited)
            if (i == 0) return false;//数组中依然有0,则证明有房间未访问到
        return true;
    }

    private void helper(List<List<Integer>> rooms, int index, int[] visited) {
        if (visited[index] == 1) return;//如果该房间已访问过,直接返回
        visited[index] = 1;//在访问过的房间,改为1来标记
        for (Integer i : rooms.get(index)) {//遍历
            helper(rooms, i, visited);
        }
    }
}

Python:

class Solution:
    def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
        size=len(rooms)
        self.visited = [False]*size # 初始化等长数组,默认为False,所有房间均未访问
        self.helper(rooms, 0)
        return all(self.visited)

    def helper(self, rooms: List[List[int]], index: int) -> None:
        if self.visited[index]:#如果为True,该房间已访问过,直接返回
            return
        self.visited[index] = True #在访问的房间标记为True
        for i in rooms[index]:#遍历钥匙
            self.helper(rooms, i)#进入递归函数

欢迎关注微.信公.众号:爱写Bug
在这里插入图片描述

转载于:https://www.cnblogs.com/zhangzhe532/p/11564522.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 841:钥匙和房间 Keys and Rooms 的相关文章

  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • java.lang.NumberFormatException: Invalid int: "3546504756",这个错误是什么意思?

    我正在创建一个 Android 应用程序 并且正在从文本文件中读取一些坐标 我在用着Integer parseInt xCoordinateStringFromFile 将 X 坐标转换为整数 Y 坐标的转换方法相同 当我运行该应用程序时
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • Trie 数据结构 - Java [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库或文档 链接提供了在 java 中实现 Trie 数据结构的更多信息 任何帮助都会很棒 Thanks 你可以阅读Java特里树
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个

随机推荐

  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展 AI绘画已经成为一个非常热门的领域 AI绘画的应用范围非常广泛 它对于设计 摄影等领域产生了积极影响 但同时 由于AI绘画的版权究竟归属于谁 AI绘画也引起了版权的争议 那么 AI到底是创造艺术还是窃取艺术呢 本文将
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • html+css实现一个响应式管理平台架构模板

    文本将会带你使用html css实现一个响应式的管理平台架构模板 目前来说市面上的管理平台架构模板大同小异 文本的知识点都会符合场景所需 目录 1 管理平台的架构内容 2 顶部的布局 3 下半部分布局 4 左侧菜单区域实现 5 右侧主体区域
  • 【EasyExcel 教程】详解写入Excel -- 写入

    愿你如阳光 明媚不忧伤 目録 4 详解写入Excel 4 1 简单写入Excel 4 2 根据参数导出指定列 排除或指定 4 3 指定写入的列 4 4 复杂头写入 4 5 日期 数字或者自定义格式的转换 4 6 图片导出 列宽 行高注解 4
  • react简介

    1 React简介 1 1 react发展历史 react是facebook开发的 vue 尤雨溪 angular 谷歌 收购的 facebook在构建instagram网站的时候遇见两个问题 数据绑定的时候 大量操作真实dom 性能成本太
  • python爬虫遇到的问题:selenium引用chromedriver出现的问题

    traceback Traceback most recent call last File D Anaconda35 lib site packages selenium webdriver chrome service py line
  • 大佬,一款小而美的Application组件,了解一下

    简介 Android开发过程中 Application类的角色不容忽视 它不仅是程序启动的入口 同时也代表着整个应用程序的生命周期 在Application中 我们通常执行以下操作 初始化各种第三方库 注册ActivityLifecycle
  • jQuery 入门教程(16): 设置或取得元素的CSS class

    jQuery支持方法用来操作HTML元素的CSS 属性 下面的方法为jQuery 提供的CSS操作方法 addClass 为指定的元素添加一个或多个CSS类 removeClass 为指定的元素删除一个或多个CSS类 toggleClass
  • Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

    技术背景 我们在Android平台实现GB28181设备接入 把摄像头和麦克风数据 采集过去 用于移动单兵 智能车载 智慧安防 智能家居 工业仿真等行业时 发现大多场景对视频水印的要求越来越高 从之前的固定位置静态文字水印 png水印等慢慢
  • IOS内购经常遇到的一些问题,和一些容易混淆的点。

    Q1 内购和Apple Pay的区别 A1 内购是内购 Apple Pay是Apple Pay 我不知道有多少人第一次接触时 会把这俩概念混淆掉 这里你可以简单这么理解 虚拟的物品就是用内购 实际的物品就是用Apple Pay Apple
  • android基础--JNI基础:C/C++语言

    JNI简介什么是JNIJNI Java Native Interface java本地开发接口JNI 是一个协议 有了这个协议可以使Java代码和C C 代码相互调用 C语言调用java是使用反射技术 C反射java 为什么用JNI JNI
  • 单片机串口接收多字节

    转自 http bbs ednchina com BLOG ARTICLE 3007162 HTM 感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说 是有点难度的 寄存器配置基本上都是死的 串口回复多字节跟回复一字节只是多了一个循
  • 二叉树(java):【1】求二叉树的深度,【2】非递归中序遍历二叉树,【3】递归算法复制二叉树T为一棵新的二叉树,【4】非递归算法计算T中的叶子数,【5】用递归算法计算T中度为1的结点数

    目录 1 求二叉树的深度 2 非递归中序遍历二叉树 3 递归算法复制二叉树T为一棵新的二叉树 4 非递归算法计算T中的叶子数 5 用递归算法计算T中度为1的结点数 6 非递归后序遍历二叉树 1 求二叉树的深度 求二叉树的深度 private
  • windows注册表

    第一课 注册表基础 一 什么是注册表 注册表是windows操作系统 硬件设备以及客户应用程序得以正常运行和保存设置的核心 数据库 也可以说是一个非常巨大的树状分层结构的数据库系统 注册表记录了用户安装在计算机上的软件和每个程序的相互关联信
  • 快速修改数组的某个值_不能更改数组的某一部分?

    大家在使用Excel编写公式时 有没有遇到过以下提示 注 版本不同 提示也有差异 有的版本是不能更改数组的某一部分 这是什么原因呢 这里需要介绍一个概念 数组公式 数组就是单元的集合或是一组处理的值集合 可以写一个以数组为参数的公式 即数组
  • ASP.NET Core快速入门(第5章:认证与授权)--学习笔记

    课程链接 http video jessetalk cn course explore 良心课程 大家一起来学习哈 任务31 课时介绍 1 Cookie based认证与授权 2 Cookie based认证实现 3 Jwt认证与授权介绍
  • C# 算法系列 - 贪婪算法(动态规划问题)

    using System using System Collections Generic namespace ConsoleApp1 class Program static void Main string args 贪婪算法 动态规划
  • 国内几个主要的ubuntu 18.04 软件源

    1 阿里源 deb http mirrors aliyun com ubuntu bionic main restricted universe multiverse deb http mirrors aliyun com ubuntu b
  • Numpy学习(2)numpy向量化、numpy操作

    1 Numpy创建向量 Numpy创建的数组有时也称为向量 但要注意两者的区别 需要注意数组的秩 Numpy使用了优化的C api 运算速度快 在深度学习需要运用numpy向量化加快运算速度 NumPy底层用C语言编写 内部解除了GIL 全
  • LeetCode 841:钥匙和房间 Keys and Rooms

    题目 有 N 个房间 开始时你位于 0 号房间 每个房间有不同的号码 0 1 2 N 1 并且房间里可能有一些钥匙能使你进入下一个房间 在形式上 对于每个房间 i 都有一个钥匙列表 rooms i 每个钥匙 rooms i j 由 0 1