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 的相关文章

随机推荐

  • 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