图论基础|841.钥匙和房间、463. 岛屿的周长

目录

841.钥匙和房间

思路:本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。

463. 岛屿的周长


841.钥匙和房间

力扣题目链接

(opens new window)

有 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:

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

示例 2:

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

思路:本题是一个有向图搜索全路径的问题。 只能用深搜(DFS)或者广搜(BFS)来搜。

//深度优先
class Solution {
public:
void dfs(vector<vector<int>>& rooms, int key, vector<bool>& visited){if(visited[key])return;visited[key]=true;vector<int>keys = rooms[key];for(int key: keys){dfs(rooms, key, visited);}}bool canVisitAllRooms(vector<vector<int>>& rooms) {vector<bool>visited(rooms.size(), false);dfs(rooms, 0, visited);for(int i : visited){if (i==false) return false;}return true;}
};

//广度优先版
class Solution {
public:bool bfs(vector<vector<int>>& rooms){vector<int>visited(rooms.size(),0);queue<int>que;visited[0]=1;//初始化,从第一个房间‘0’开始que.push(0);while(!que.empty()){int key =que.front();que.pop();vector<int>keys=rooms[key];for(int key: keys){if(!visited[key]){que.push(key);visited[key]=1;}}}for(int i:visited){if(!i)return false;}return true;}bool canVisitAllRooms(vector<vector<int>>& rooms) {return bfs(rooms);}
};

463. 岛屿的周长

力扣题目链接

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

  • 输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
  • 输出:16
  • 解释:它的周长是上面图片中的 16 个黄色的边

示例 2:

  • 输入:grid = [[1]]
  • 输出:4

示例 3:

  • 输入:grid = [[1,0]]
  • 输出:4

思路:遍历地图,遇到岛屿,遍历其上下左右四个方向,如果遇到边界或者遇到水域(grid[nextx][nexty]=0),result++;

class Solution {
public:int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};int islandPerimeter(vector<vector<int>>& grid) {int result = 0;for (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {if (grid[i][j] == 1) {            // 遇到陆地for (int k = 0; k < 4; k++) { // 搜索各个方向int nextx = i + dir[k][0];int nexty = j + dir[k][1];if (nextx < 0 || nextx >= grid.size() || nexty < 0 ||nexty >= grid[0].size() ||grid[nextx][nexty] ==0) { // 遇到边界或者水域,周长++;result++;}}}}}return result;}
};

参考:代码随想录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git 常用命令-以及命令解析

一、Push操作 1.先git init 标识仓库地址2.git add xxx git add . 代表添加当前目录所有文件代表标识提交的文件3.git commit -m xxxx 代表git提交后需要说的什么话4.git remote add origin xxxx xxxx替换为github仓库的ssh地址5.git push origin xxx xxx为分支名称如果有报错可…

TCP重传机制详解——03DSACK

TCP重传机制详解——03DSACK 什么是DSACK DSACK是指"Duplicate Selective Acknowledgment"&#xff0c;即重复选择性确认。在TCP通信中&#xff0c;DSACK机制允许接收方向发送方发送有关重复数据包的信息&#xff0c;以帮助发送方更准确地处理重传和丢包情况。 当…

C语言- 输出班级第n个学生的平均成绩

题目描述 输出班级第 n个学生的平均成绩。每个学生有英语、数学、语文、计算机 4 科成绩。若干个学生的 4 门成绩构成一个表格&#xff0c;可以用二维数组储存&#xff0c;每行代表一个学生的 4 门成绩。以为要计算某个学生的平均成绩&#xff0c;需要快速定位到该生成绩的起始…

概率论与数理统计-条件概率题目1-两次取球问题(有放回)

题目&#xff1a; 设袋中装有r只红球,t只白球.每次自袋中任取一只球,观察其颜色例3然后放回,并再放入a只与所取出的那只球同色的球.若在袋中连续取球四次&#xff0c;试求第一、二次取到红球且第三、四次取到白球的概率. 解答&#xff1a; 涉及到条件概率和多次独立事件的概…

ColorWell for Mac 直装激活 非常实用的调色工具

ColorWell 是一款为Mac操作系统设计的实用工具&#xff0c;它旨在帮助用户快速而方便地选择、管理和应用颜色。这款应用程序特别适合设计师、插画师、网页开发者以及任何需要精确颜色匹配的专业人士使用。ColorWell 的核心功能是提供一个简单直观的界面&#xff0c;让用户可以轻…

C++一维数组练习oj(3)

为什么C的一维数组练习要出要做那么多的题目&#xff1f;因为我们是竞赛学生&#xff01;想要将每个知识点灵活运用的话就必须刷大量的题目来锻炼思维。 我使用的是jsswoj.com这个刷题网站&#xff0c;当然要钱... C一维数组练习oj(2)-CSDN博客这是上一次的题目讲解 这道题有…

vscode集成git管理项目

一、git与SVN Git&#xff1a; 是一种分布式版本控制系统&#xff0c;每个开发者都可以在本地完整地复制整个代码仓库&#xff0c;并且可以在不连接到中央服务器的情况下进行提交、分支和合并等操作。 SVN &#xff1a;是一种集中式版本控制系统&#xff0c;开发者们只能直接与…

PwnLab靶场PHP伪协议OSCP推荐代码审计命令劫持命令注入

下载链接&#xff1a;PwnLab: init ~ VulnHub 安装&#xff1a; 打开vxbox直接选择导入虚拟电脑即可 正文&#xff1a; 先用nmap扫描靶机ip nmap -sn 192.168.1.1/24 获取到靶机ip后&#xff0c;对靶机的端口进行扫描&#xff0c;并把结果输出到PwnLab文件夹下&#xff0c;命名…

java每日一题——买啤酒(递归经典问题)

前言&#xff1a; 非常喜欢的一道题&#xff0c;经典中的经典。打好基础&#xff0c;daydayup!!!啤酒问题&#xff1a;一瓶啤酒2元&#xff0c;4个盖子可以换一瓶&#xff0c;2个空瓶可以换一瓶&#xff0c;请问10元可以喝几瓶 题目如下&#xff1a; 啤酒问题&#xff1a;一瓶…

【剑指offer】17. 从尾到头打印链表(java选手)

题目链接 题目链接 题目描述 输入一个链表的头结点&#xff0c;按照 从尾到头 的顺序返回节点的值。 返回的结果用数组存储。 数据范围 0≤ 链表长度 ≤1000。 样例 输入&#xff1a;[2, 3, 5] 返回&#xff1a;[5, 3, 2] 思路 &#xff08;1&#xff09;从头到尾遍历链…

大数据实时计算的Windows功能?

Windows是数据流的时间窗口&#xff0c;流式数据特点就是源源不断没有边界&#xff0c;但是对于我们数据使用者而言很多时候业务要求对特定时间长度的数据进行切片并统计分析&#xff0c;以此来反映通过时间变化某个业务指标的变化情况&#xff0c;这个时候就需要用到流式计算引…

本地部署千问大模型笔记

使用llama.cpp运行大模型&#xff1a; main 命令有一系列参数可选&#xff0c;其中比较重要的参数有&#xff1a; -ins 交互模式&#xff0c;可以连续对话&#xff0c;上下文会保留 -c 控制上下文的长度&#xff0c;值越大越能参考更长的对话历史&#xff08;默认&#xff1a…

进程和线程,线程实现的几种基本方法

什么是进程&#xff1f; 我们这里学习进程是为了后面的线程做铺垫的。 一个程序运行起来&#xff0c;在操作系统中&#xff0c;就会出现对应的进程。简单的来说&#xff0c;一个进程就是跑起来的应用程序。 在电脑上我们可以通过任务管理器可以看到&#xff0c;跑起来的应用程…

java锁关键字sychronized

前置知识&#xff1a; 在HotSpot虚拟机中&#xff0c;对象在内存中存储可分为三块区域&#xff1a; 对象头&#xff1a;有MarkWord和Klass Word组成实例数据&#xff1a;里面主要是成员变量对齐填充&#xff1a;不是8的整数倍&#xff0c;则填充 CAS: Compare and Swap是Jav…

3.24 day3 QT

使用手动连接&#xff0c;将登录框中的取消按钮使用ot4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;密码是否为&…

video/pdf文件预览与进度上传

video 视频文件直接使用video标签预览&#xff0c;和后端设定的是学员在观看视频时&#xff0c;前端会5秒钟上传一次进度&#xff0c;记录学员当前视频所学的进度&#xff0c;当视频观看完成时会立即触发一次进度上报接口。 <videoref"video":src"xxxxx&quo…

03-SparkSQL入门

0 Shark Spark 的一个组件&#xff0c;用于大规模数据分析的 SQL 查询引擎。Shark 提供了一种基于 SQL 的交互式查询方式&#xff0c;可以让用户轻松地对大规模数据集进行查询和分析。Shark 基于 Hive 项目&#xff0c;使用 Hive 的元数据存储和查询语法&#xff0c;并基于Hiv…

状态机高阶讲解-10

1896 01:19:16,700 --> 01:19:19,550 那接下来我们就开始来建模了 1897 01:19:20,690 --> 01:19:22,163 那建模的开始呢 1898 01:19:22,163 --> 01:19:24,900 我们就首先要添加一个类了 1899 01:19:26,330 --> 01:19:27,868 那我们这个很简单 1900 01:19:27,86…

力扣100热题[哈希]:最长连续序列

原题&#xff1a;128. 最长连续序列 题解&#xff1a; 官方题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;题解&#xff0c;最长连续序列 &#xff1a;哈希表 官方解题思路是先去重&#xff0c;然后判断模板长度的数值是否存在&#xff0c;存在就刷新&#xff0c…

js教程(8)

一、事件流 1.概述 在JavaScript中&#xff0c;事件流描述的是事件在DOM结构中传播和被处理的顺序。事件流分为冒泡阶段和捕获阶段。 冒泡阶段&#xff08;Bubbling Phase&#xff09;&#xff1a;事件首先从最内层的元素开始向父级元素传播&#xff0c;一直传播到最外层的元素…