LeetCode 841.钥匙和房间 - C++ - 小结

2023-11-12

钥匙和房间

有 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

示例:

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

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

提示:

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

个人理解
当进入一个房间时,根据钥匙,进入更深的房间,并且标记房间,如果没路了,回来继续进入其他钥匙指向的房间,直到结束。

代码如下(C++):

class Solution {
public:
  bool canVisitAllRooms(vector<vector<int>>& rooms) {
    int roomCount = rooms.size();   // 获取房间数量
    vector<bool> visited(roomCount, false);   // 定义可访问房间
    visited[0] = 1;     // 从第0房间开始
    stack <int> keys;   // 钥匙栈
    keys.push(0);
    while(!keys.empty())    // DFS
    {
      int key = keys.top();
      keys.pop();
      int rs = rooms[key].size();
      for(int i = 0; i < rs; ++i)     // 把房间里的钥匙遍历
      {
        if(!visited[rooms[key][i]])   // 如果这个钥匙去的地方我们可以进入,就不添加钥匙
        {
          visited[rooms[key][i]] = true;    // 否则添加
          keys.push(rooms[key][i]);         // 然后把钥匙推入栈,继续走
        }
      }
    }
    for(int i = 1; i < roomCount; i++){     // 遍历所有添加进去的可访问房间
      if(!visited[i]) return false;         // 任何一个错误,就返回false
    }
    return true;
  }
};

放在最后

如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~

更多精彩内容也可以访问我的博客Aelous-BLog

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

LeetCode 841.钥匙和房间 - C++ - 小结 的相关文章

  • 【数电】理解MOS管的Vth(增强型)

    其实就是 对NMOS来说 栅极底下是P型半导体 有空穴和B 离子 栅衬之间加电压 电子往栅极底下跑 与空穴复合 此时形成耗尽层 虽然因为B 离子的原因带负电 但无法自由移动 当电压超过Vth 多余电子来到栅极底下 可自由移动 形成沟道
  • C或C++项目实战之贪吃蛇

    编译环境 VS2017 VS其他版本皆可 EasyX图形库 编程语言 c c 当前版本 snakeGame1 0 修改时间 2019 6 13 项目组成 5 1 头文件 snake snake h 5 2 源文件 main cpp snak
  • python获取程序运行过程中所需要的时间

    使用python的过程中 需要得知程序从运行开始到结束所需要的时间 可以使用clock 的方法来实现 引入所需要的时间库 import datetime import time 程序计时器 启动计时器 start time clock 中间

随机推荐

  • conda 环境无法激活的问题

    项目场景 提示 这里简述项目相关背景 例如 项目场景 示例 通过蓝牙芯片 HC 05 与手机 APP 通信 每隔 5s 传输一批传感器数据 不是很大 安装anaconda3 pypcharm pycharm解释器使用anaconda3目录下
  • Dynamics 365 9.0 Version 新功能(1) 支持查找没有Opporunity的Account

    Dynamics 365 升级到9 0版本后 增强了高级查找中相关实体1 N关系的不包含数据的查询 这个功能虽然不太起眼 但是确实很多人期盼已久的 先来看下之前版本的高级查找 我以Accouts为示例 选择查询的相关实体是Opportuni
  • 4.tcp问题及进程

    1 tcp 问题 a 粘包 b 拆包 解决 1 1 解决方案 1 粘包 特殊字符方式 a 当时短连接的情况下 不用考虑粘包的情况 b 如果发送数据无结构 如文件传输 这样发送方只管发送 接收方只管接收存储就ok 也不用考虑粘包 c 如果双方
  • ccf-201412-3 集合竞价(详解)

    ccf 201412 3 集合竞价 详解 试题编号 201412 3 试题名称 集合竞价 时间限制 1 0s 内存限制 256 0MB 问题描述 问题描述 某股票交易所请你编写一个程序 根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘
  • alive workers 数量为0的解决方案

    因为hostname显示的主机名与 etc hosts中的主机名不相同 所以都会导致无法连接slave 将集群的主机均实现hostname与 etc hosts名称一样 就解决了问题 如下所示
  • 捕获原点

    一 什么是捕获 即当某一种信号触发时 GTS 运动控制器能准确记录触发时刻轴的位置信息 二 捕获的方式 GTS 控制卡提供四种捕获方式 Home 捕获 Index 捕获 探针 Probe 捕获和 HSIO 捕获 1 Home捕获模式 GTS
  • vue3中使用第三方插件mitt实现任意组件通讯

    vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一 现在我在写代码时 一个组件的代码超过了200行 基本都会拆分组件 组件拆分后 组件之间的通讯就很重要 总结了一下 目前有这么几种组件通讯类型 父子通讯
  • Arduino基于ESP8266模块的TCP透传功能使用TCP透传协议连接移动onenet

    一 硬件资源 1 Arduion UNO R3 2 ESP8266WIFI模块 二 需要提前明确的知识点 1 ESP8266模块具有TCP透传功能 通过AT指令可以使得WIFI模块连接至相应的服务器 2 onenet具有多协议接入方式 例如
  • 网络流(入门)-概念

    相关概念介绍 这里的相关概念引用的是yxc大佬的讲解 在这里特别感谢yxc大佬的算法课 让我入了算法竞赛的门 1 1 流网络 G V E 特点 是一个有向图 且可以有环 不考虑反向边 即使有反向边 也可以通过加点来把一条反向边 变成两条单向
  • Candence学习篇(6)使用allegro绘制元器件的PCB封装

    文章目录 前言 一 确定引脚坐标位置 二 新建封装 2 1设置封装的大小 2 2 设置焊盘路径 三 绘制PCB封装 3 1参数设置 3 2放置边框矩形 3 3放置装配层 放置丝印层和1脚指示原点 总结 前言 前面我们讲了 Candence学
  • 一只兔子每三个月生兔子JAVA,兔子生兔子问题

    关于兔子生兔子的算法详解 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔 子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 分析 第1个月 1对 第2个月 1对 第3个月 原来的1对 新生1对 2对 第4
  • 指针在函数中的传递,搞懂这两幅图指针基础就过关了

    a本身即是char 类型 所以 a是char 类型 strcpy 中里面的参数是地址 adf 前面应该要加 吧 printf输出的是数组 所以用a
  • Git安装操作流程(超超超级详细)

    一 前言 被迫投向程序媛的行列 一切都要白手起家 接下来就以初学者的视角手把手记录 git 教程 由于我体质特殊 过手的普通操作也总能有各类bug 因此教程也会不定期更新我的bug们 二 Git 下载及安装 1 Git 安装 首先去 Git
  • html jwt权限控制,SpringBoot+SpringSecurity+JWT实RESTfulAPI权限控制

    在整合jwt之前 我们首先要在SpringBoot中整合security的模块 来实现基于security的授权控制 用过security的人都知道 它的功能无比的强大比shiro还要强大 但是今天我就介绍security中关于权限控制和是
  • Linux基础与实操_韩顺平mooc知识点笔记

    Linux 目录 Linux 一 介绍 1 1目录结构 二 实操 2 1远程登陆 2 2 vi和vim 2 2 1 三种模式 2 2 2 快捷键 2 3 关机 重启 2 5 用户管理 2 5 1 用户家目录 2 5 2 添加用户 2 5 3
  • java入门到进阶书单

    入门 1 2年 初级 Head First Java 主要讲设计模式 这个是设计思想方面的 我之所以觉得它应该最早学 就是觉得这个对今后你看jdk tomcat源码 看第三方项目源码 以及一些大数据中间源码有所帮助 另外也有一本书叫 大话设
  • Matlab-矩阵

    目录 一 矩阵的操作 1 创建矩阵 1 建立简单矩阵 2 建立特殊矩阵 3 希尔伯特 Hilbert 矩阵 4 托普利兹 Toeplitz 矩阵 5 0 1间均匀分布的随机矩阵 6 标准正态分布随机矩阵 7 魔方矩阵 8 帕斯卡矩阵 9 范
  • IT中文技术站十大网站收藏

    1 CSDN www csdn net CSDN Chinese Software Developer Network 创立于1999年 是中国的IT社区和服务平台 为中国的软件开发者和IT从业者提供知识传播 职业发展 软件开发等全生命周期
  • 六种线程状态详解

    1 线程状态概述 线程从创建到运行到结束是一个线程的生命周期 当线程被创建到结束过程中 不是一直处于运行状态的 下面来介绍一下线程从运行到结束所有的状态 线程状态 导致状态发生条件 NEW 新建 线程刚被创建 没有启动 也就是还没调用sta
  • LeetCode 841.钥匙和房间 - C++ - 小结

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