LeetCode 图-岛屿问题

  • 图的基本知识
    • 基本概念
      • 图的类型
      • 相关术语
    • 图的存储
  • LeetCode 相关题目
    • 岛屿问题
      • 岛屿的最大面积
      • 岛屿的周长

图的基本知识

基本概念

图的类型

  • 无向图
  • 有向图
  • 加权图

相关术语

  • 顶点
  • 路径
  • 路径长度
  • 负权环
  • 连通性
  • 顶点的度
  • 入度
  • 出度

图的存储

  • 邻接矩阵存储:是用一个二维数据数组(矩阵)存储图中顶点间的邻接关系。假设图G=(V, E)n个顶点,那么邻接矩阵就是n*n的方阵。

以有权图为例:
在这里插入图片描述

  • 邻接表:对于每个图的顶点v,将所有邻接于顶点v的顶点链成一个单链表(边表)。
    以有权图为例:
    在这里插入图片描述

LeetCode 相关题目

岛屿问题

我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而今天讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。

网格类问题的 DFS 遍历方法:

  • 网格问题是由 m * n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。
  • 岛屿问题每个格子中的数字可能是 0 或者 1。0 看成海洋,1 看成陆地,这样相邻的陆地就连接成一个岛屿。在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。

二叉树 DFS 遍历一般是这样的:

void dfs(TreeNode* root) {// base caseif (root == nullptr) return;// visit adjacent nodedfs(root->left);dfs(root->right);
}

其中最关键的是处理好base case 的判断,以及访问相邻节点。在网格问题中,相邻节点就是上下左右四个格子,base case 就是数组下标越界的情况。
于是可以写出网格问题 dfs 遍历的代码:

void dfs(vector<vector<int>>& grid, int r, int c) {// base caseif (!inArea(grid, r, c) return;// visit adjacentdfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);
}bool inArea(vector<vector<int>>& grid, int r, int c) {return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size()}

网格结构的 DFS 与二叉树的 DFS 最大的不同之处在于,遍历中可能遇到遍历过的结点。如何避免这样的重复遍历呢?答案是标记已经遍历过的格子。以岛屿问题为例,我们需要在所有值为 1 的陆地格子上做 DFS 遍历。每走过一个陆地格子,就把格子的值改为 2,这样当我们遇到 2 的时候,就知道这是遍历过的格子了。

void dfs(vector<vector<int>>& grid, int r, int c) {// base caseif (!inArea(grid, r, c) return;if (grid[r][c] != 1) return;grid[r][c] = 2;// visit adjacentdfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);
}bool inArea(vector<vector<int>>& grid, int r, int c) {return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();
}

岛屿的最大面积

LeetCode-695 岛屿的最大面积

class Solution {
public:int maxAreaOfIsland(vector<vector<int>>& grid) {if (grid.size() == 0) return 0;int r = grid.size(), c = grid[0].size();for (int row = 0; row < r; row++) {for (int col = 0; col < c; col++) {int area = dfs(grid, row, col);max_area = max(max_area, area);}}return max_area;}
private:int max_area = 0;bool inArea(vector<vector<int>>& grid, int r, int c) {return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();}int dfs(vector<vector<int>>& grid, int r, int c) {if (!inArea(grid, r, c) || grid[r][c] != 1) return 0;grid[r][c] = 2;return 1+ dfs(grid, r-1, c)+ dfs(grid, r+1, c)+ dfs(grid, r, c-1)+ dfs(grid, r, c+1);}
};

岛屿的周长

LeetCode-200 岛屿的周长
岛屿的周长是计算岛屿全部的「边缘」,而这些边缘就是我们在 DFS 遍历中,dfs 函数返回的位置。观察题目示例,我们可以将岛屿的周长中的边分为两类,如下图所示。黄色的边是与网格边界相邻的周长,而蓝色的边是与海洋格子相邻的周长。

  • 当 dfs 函数因为「坐标 (r, c) 超出网格范围」返回的时候,就经过了一条黄色的边;
  • 当函数因为「当前格子是海洋格子」返回的时候,就经过了一条蓝色的边。这样就把岛屿的周长跟 DFS 遍历联系起来了。
class Solution {
public:int islandPerimeter(vector<vector<int>>& grid) {if (grid.size() == 0) return 0;int r = grid.size(), c = grid[0].size();for (int row = 0; row < r; row++) {for (int col = 0; col < c; col++) {if (grid[row][col] == 1) {return dfs(grid, row, col);}}}return 0;}
private:bool inArea(vector<vector<int>>& grid, int r, int c) {return r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size();}int dfs(vector<vector<int>>& grid, int r, int c) {// base caseif (!inArea(grid, r, c)) return 1;if (grid[r][c] == 0) return 1;if (grid[r][c] != 1) return 0;grid[r][c] = 2;// visit adjacentreturn dfs(grid, r - 1, c) + dfs(grid, r + 1, c) + dfs(grid, r, c - 1) + dfs(grid, r, c + 1);}
};

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

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

相关文章

豆包大模型API接入

1.安装JDK pip install volcengine 2.API接入 from volcengine.maas.v2 import MaasService maas MaasService(maas-api.ml-platform-cn-beijing.volces.com, cn-beijing) maas.set_ak(###access_key###&#xff09; maas.set_sk(###secret_key###) req { "strea…

MongoDB~基本知识记录

为何要学Mongodb 工作以来&#xff0c;使用最多、了解最多的是MySQL。但技术的发展一定是依据痛点来的&#xff0c;就比如我遇到的痛点&#xff0c;一个业务、一个平台能力、存储的一个对象&#xff0c;随着产品和运营的需求&#xff0c;不断的进行变更&#xff0c;每一次的变…

真机调试 Error:系统错误,xxx exceed max limit 2MB

我们在使用微信开发者工具开发小程序、小游戏等应用时&#xff0c;往往会点击“真机调试”&#xff0c;微信扫描查看真实情况。 但是会出现下面的报错提示&#xff0c;是因为主包体积超过了2MB。 小程序有体积和资源加载限制&#xff0c;在微信小程序中&#xff0c;每个包不能…

obj 编程语言:深入剖析其独特之处与未来展望

obj 编程语言&#xff1a;深入剖析其独特之处与未来展望 obj编程语言&#xff0c;作为计算机编程领域的一颗璀璨明珠&#xff0c;以其独特的设计理念和强大的功能吸引着众多开发者的目光。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;对obj编程语言进行深度剖…

vue3简单快速实现主题切换功能

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《vue3实战》 目录 内容概要 实现步骤 1.定义不同主题的css样式变量 2.入口main.ts中引入这个样式文件 3.主题样式css变量引用 4.设置默认主题样式 5.实现点击按钮主题切换 总结 最近发现了一个巨牛的人工智…

【Linux-buildroot,】

Linux-buildroot, ■ buildroot■ 1、简介■ 2、下载■ 2、编译■ 问题一&#xff1a;buildroot 编译的时候会先从网上下载所需的软件源码&#xff0c;下载cmake-3.8.2.tar.gz或下载很慢的情况 ■ buildroot-构建根文件系统■ 1、配置 buildroot■ 2、■ 3、 ■ buildroot-构建…

TK防关联引流系统:全球TikTok多账号运营的神器

在TikTok的生态中&#xff0c;高效运营多个账号已成为品牌全球推广的必经之路。为此&#xff0c;TK防关联引流系统应运而生&#xff0c;它是一款专为TikTok设计的效率神器&#xff0c;助您迅速搭建并管理全球多账号矩阵。该系统由先进的“防关联智能终端”硬件和智能的“TK防关…

AI生成微信职业头像

加油&#xff0c;新时代打工人&#xff01; 真别说&#xff0c;还挺好看的 https://chatglm.cn/main/alltoolsdetail

GPT-4o:免费且更快的模型

OpenAI GPT-4o 公告 OpenAI 推出了增强版 GPT-4 模型——OpenAI GPT-4o&#xff0c;用于支持 ChatGPT。首席技术官 Mira Murati 表示&#xff0c;更新后的模型速度更快&#xff0c;并在文本、视觉和音频处理方面有了显著提升。GPT-4o 将免费向所有用户开放&#xff0c;付费用户…

C++中类的访问权限及友元函数

目录 摘要 访问权限&#xff08;Access Specifiers&#xff09; 1. private 2. protected 3. public 友元函数&#xff08;Friend Functions&#xff09; 关键点 总结 摘要 C中的访问权限&#xff08;Access Specifiers -- private、protected、public&#xff09;和友…

shell脚本不用nohup如何在后台执行?

supervisord进程管理(go版本) 主要是托管自已的脚本 进程管理工具。 可以监听、启动、停止、重启一个或多个进程 用supervisord管理的进程,当一个进程意外被杀死,supervisord监听到进程死后,会自动将它重启,很方便的做到进程的自动恢复的功能,不在需要自己写脚本来控制 启动文…

乐高小人分类项目

数据来源 LEGO Minifigures | Kaggle 建立文件目录 BASE_DIR lego/star-wars-images/ names [YODA, LUKE SKYWALKER, R2-D2, MACE WINDU, GENERAL GRIEVOUS ] tf.random.set_seed(1)# Read information about dataset if not os.path.isdir(BASE_DIR train/):for name in …

plc scl编程语言:深度解析与应用探索

plc scl编程语言&#xff1a;深度解析与应用探索 在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;扮演着至关重要的角色。而SCL&#xff08;结构化控制语言&#xff09;作为PLC的一种编程语言&#xff0c;因其强大的功能和灵活性备受青睐。本文将从…

利用 Docker 简化Redis部署:快速搭建Redis服务

利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务 目录 利用 Docker 简化Redis部署&#xff1a;快速搭建Redis服务为什么选择 Docker准备工作拉取Redis镜像快速运行Redis容器验证Redis服务总结 在现代软件开发中&#xff0c;Redis作为一种高性能的键值数据库&#xff0…

52 https

HTTPS是什么 https也是一个应用层协议&#xff0c;是在http协议的基础上引入了一个加密层 http协议内容都是按照文本的方式明文传输的&#xff0c;这就导致在传输过程中出现一些被篡改的情况 http和https是可以同时存在的&#xff0c;数据时从应用层自上往下发的&#xff0c…

简述浏览器和 Node.js 中的事件循环 ?

浏览器和Node.js中的事件循环都是用于处理异步任务和回调函数的机制&#xff0c;但它们在某些实现细节和用途上有所不同。下面分别对它们进行简述&#xff1a; 浏览器中的事件循环 目的&#xff1a; 浏览器事件循环是浏览器用于处理用户输入、网络请求、渲染和其他异步事件的机…

OVP、TVS、ESD二极管、稳压二极管的区别

本文介绍OVP、TVS、ESD二极管、稳压二极管简介及TVS与ESD的区别。 文章目录 一、简介1、过压保护&#xff08;OVP, Over-Voltage Protection&#xff09;3、稳压二极管&#xff08;Zener Diode 或齐纳二极管&#xff09;小结&#xff1a; 二、TVS&ESD的区别1、设计目标2、…

C++的PDF库

PDF&#xff08;Portable Document Format&#xff0c;可移植文档格式&#xff09;是一种由 Adobe Systems 开发并推出的文件格式。PDF 主要用于在不同平台和设备之间精确呈现文档&#xff0c;无论是在 Windows、macOS、Linux 还是其他操作系统上打开&#xff0c;文档的外观都保…

springboot 集成minio 实现文件上传

引入依赖 <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.0</version> </dependency>因为我是后端开发需要使用knife4j <?xml version"1.0" encoding"UTF-8"…

数仓建模—ChatETL

数仓建模—ChatETL 前面我们介绍过ChatBI ,就是让用户通过自然语言对话的方式可以获取到自己想要的数据,然后通过合适的报表展示出来,其实我们可以将其理解为应用层面的技术创新,但是这个实现的前提就是我们底层已经有加工好的大量的数据模型数据表,并且有完善的元数据建…