hot100-图论/岛屿问题

问题模板
为什么要将格子标记为【已遍历】—避免 重复遍历
(这是因为,网格结构本质上是一个「图」,我们可以把每个格子看成图中的结点,每个结点有向上下左右的四条边。在图中遍历时,自然可能遇到重复遍历结点。这时候,DFS 可能会不停地「兜圈子」,永远停不下来

void dfs(int[][] grid, int r, int c) {// 判断 base caseif (!inArea(grid, r, c)) {return;}// 如果这个格子不是岛屿,直接返回if (grid[r][c] != 1) {return;}grid[r][c] = 2; // 将格子标记为「已遍历过」// 访问上、下、左、右四个相邻结点dfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);
}// 判断坐标 (r, c) 是否在网格中
boolean inArea(int[][] grid, int r, int c) {return 0 <= r && r < grid.length && 0 <= c && c < grid[0].length;
}

200. 岛屿数量

class Solution {public int numIslands(char[][] grid) {if(grid==null||grid.length==0)return 0;int cnt=0;int m=grid.length;int n =grid[0].length;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]=='1'){cnt++;dfs(grid,i,j);}}}return cnt;}void dfs(char[][] grid, int r, int c) {// 判断 base caseif (!inArea(grid, r, c)) {return;}// 如果这个格子不是岛屿,直接返回if (grid[r][c] != '1') {return;}grid[r][c] = '2'; // 将格子标记为「已遍历过」// 访问上、下、左、右四个相邻结点dfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);}// 判断坐标 (r, c) 是否在网格中boolean inArea(char[][] grid, int r, int c) {return 0 <= r && r < grid.length && 0 <= c && c < grid[0].length;}
}

695. 岛屿的最大面积

这道题同样根据dfs模板走,只不过区别是dfs返回值变成了 1+dfs(上下左右)的面积

class Solution {public int maxAreaOfIsland(int[][] grid) {int m = grid.length;int n = grid[0].length;int max_area=0;for(int i = 0;i<m;i++){for(int j=0;j<n;j++){int temp_area=dfs(grid,i,j);max_area=Math.max(max_area,temp_area);}}return max_area;}int  dfs(int[][] grid,int r,int c){int m = grid.length;int n= grid[0].length;if(!inArea(grid,r,c))return 0;//不是岛屿 直接返回if(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);}boolean inArea(int[][] grid,int r,int c){return r>=0&&r<grid.length&&c>=0&&c<grid[0].length;}
}

463. 岛屿的周长

岛屿的周长是计算岛屿全部的「边缘」,而这些边缘就是我们在 DFS 遍历中,dfs 函数返回的位置。
当我们的 dfs 函数因为「坐标 (r, c) 超出网格范围」返回的时候,实际上就经过了一条黄色的边;而当函数因为「当前格子是海洋格子」返回的时候,实际上就经过了一条蓝色的边

class Solution {public int islandPerimeter(int[][] grid) {for (int r = 0; r < grid.length; r++) {for (int c = 0; c < grid[0].length; c++) {if (grid[r][c] == 1) {// 题目限制只有一个岛屿,计算一个即可return dfs(grid, r, c);}}}return 0;}int dfs(int[][] grid, int r, int c) {// 函数因为「坐标 (r, c) 超出网格范围」返回,对应一条黄色的边if (!inArea(grid, r, c)) {return 1;}// 函数因为「当前格子是海洋格子」返回,对应一条蓝色的边if (grid[r][c] == 0) {return 1;}// 函数因为「当前格子是已遍历的陆地格子」返回,和周长没关系if (grid[r][c] != 1) {return 0;}grid[r][c] = 2;return dfs(grid, r - 1, c)+ dfs(grid, r + 1, c)+ dfs(grid, r, c - 1)+ dfs(grid, r, c + 1);}// 判断坐标 (r, c) 是否在网格中boolean inArea(int[][] grid, int r, int c) {return 0 <= r && r < grid.length && 0 <= c && c < grid[0].length;}
}

另一类bfs问题

994. 腐烂的橘子

想象以污染的橘子为污染源,然后将相邻的橘子一层一层污染,考虑BFS

class Solution{
public int orangesRotting(int[][] grid) {int M = grid.length;int N = grid[0].length;Queue<int[]> queue = new LinkedList<>();int count = 0; // count 表示新鲜橘子的数量for (int r = 0; r < M; r++) {for (int c = 0; c < N; c++) {if (grid[r][c] == 1) {count++;} //一开始,我们找出所有腐烂的橘子,将它们放入队列,作为第 0 层的结点。//就是污染源else if (grid[r][c] == 2) {queue.add(new int[]{r, c});}}}int round = 0; // round 表示腐烂的轮数,或者分钟数while (count > 0 && !queue.isEmpty()) {round++;int n = queue.size();for (int i = 0; i < n; i++) {int[] orange = queue.poll();int r = orange[0];int c = orange[1];//将相邻方向依次污染if (r-1 >= 0 && grid[r-1][c] == 1) {grid[r-1][c] = 2;count--;queue.add(new int[]{r-1, c});}if (r+1 < M && grid[r+1][c] == 1) {grid[r+1][c] = 2;count--;queue.add(new int[]{r+1, c});}if (c-1 >= 0 && grid[r][c-1] == 1) {grid[r][c-1] = 2;count--;queue.add(new int[]{r, c-1});}if (c+1 < N && grid[r][c+1] == 1) {grid[r][c+1] = 2;count--;queue.add(new int[]{r, c+1});}}}if (count > 0) {return -1;} else {return round;}
}
}

207. 课程表

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {//判断是否是有向无环图-------》拓扑排序//通过课程前置条件列表 prerequisites 可以得到课程安排图的 邻接表 adjacency//统计课程安排图中每个节点的入度,生成 入度表 indegrees。//借助一个队列 queue,将所有入度为 0 的节点入队。//拓扑排序过程//删顶点 再把顶点的出边删掉,即对应所有邻接节点的入度-1//当入度 −1后邻接节点 cur 的入度为 0,说明 cur 所有的前驱节点已经被 “删除”,//此时将 cur 入队。int[] indegree = new int[numCourses];List<List<Integer>> adjacent  = new ArrayList<>();Queue<Integer> list = new LinkedList<>();for(int i=0;i<numCourses;i++)adjacent.add(new ArrayList<>());for(int[] tmp : prerequisites) {indegree[tmp[0]]++;adjacent.get(tmp[1]).add(tmp[0]);}//将所以入度为0的节点入队for(int i=0;i<numCourses;i++){if(indegree[i]==0)list.add(i);}//排序过程while(!list.isEmpty()){int pre =list.poll();numCourses--;//他的邻接节点入度--for(int tmp :adjacent.get(pre)){indegree[tmp]--;if(indegree[tmp]==0)list.add(tmp);}}return numCourses==0;}
}

208. 实现 Trie (前缀树)


class Trie {class TrieNode{private boolean isEnd;TrieNode[] next;public TrieNode() {isEnd = false;next= new TrieNode[26];}}private TrieNode root;public Trie(){root = new TrieNode();}public void insert(String word) {TrieNode node = root;for(char c : word.toCharArray()){if(node.next[c-'a']==null)node.next[c-'a']=new TrieNode();node=node.next[c-'a'];}node.isEnd = true;}public boolean search(String word) {TrieNode node = root;for(char c :word.toCharArray()){if(node.next[c-'a']==null){return false;}node=node.next[c-'a'];}return node.isEnd;}public boolean startsWith(String prefix) {TrieNode node = root;for(char c :prefix.toCharArray()){if(node.next[c-'a']==null){return false;}node=node.next[c-'a'];}return true;}
}

注意 startwith和search的区别
startwith 走完prefix循环就可以返回true;
而search走完循环还要看是不是到最终的叶结点了
不然 比如word为prefix 而树中是prefixxx 也会错误的search为true

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

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

相关文章

pytorch 今日小知识3——nn.MaxPool3d 、nn.AdaptiveAvgPool3d、nn.ModuleList

MaxPool3d — PyTorch 2.2 documentation 假设输入维度&#xff08;1,2,3,4,4&#xff09; maxpool torch.nn.MaxPool3d(kernel_size(2, 2, 2), stride(2, 2, 2), padding(1, 0, 0))F 维的 kernel_size 为 2&#xff0c;说明在 F 维的覆盖的 frame 数为 2&#xff0c;也就是…

通过Maven导入本地jar包

1.创建lib文件夹&#xff0c;把jar包放到文件夹里面 2.在pom里导入依赖 导入完成

(AlGC小站,Free2gpt,GPT4 | ora.ai,智能助手,chatGAi,Chatgpt在线网页版)分享6个好用的chatGPT

目录 1、Chatgpt在线网页版-永久免费使用! 2、AIGC小站 3、Free2gpt 4、GPT4 | ora.ai

LangChain-Chatchat 开源知识库来了

LangChain-Chatchat 开源知识库来了 LangChain-Chatchat 架构设计LangChain-ChatChat 具体实现过程 一键本地离线部署软件环境硬件环境支持三种部署方式 LangChain-Chatchat 是基于 ChatGLM 等大语言模型与 LangChain 等应用框架实现&#xff0c;开源、可离线部署的 RAG 检索增…

Achronix FPGA增加对Bluespec提供的基于Linux的RISC-V软处理器的支持,以实现可扩展数据处理

Bluespec支持加速器功能的RISC-V处理器将Achronix的FPGA转化为可编程SoC 2024年4月——高性能FPGA芯片和嵌入式FPGA&#xff08;eFPGA&#xff09;硅知识产权&#xff08;IP&#xff09;领域的领先企业Achronix半导体公司&#xff0c;以及RISC-V工具和IP领域的行业领导者Blues…

ASP.NET MVC中Filter过滤器的使用

MVC Filter是典型的AOP&#xff08;面向切面编程&#xff09;应用&#xff0c;在ASP.NET MVC中的4个过滤器类型&#xff0c;如下&#xff1a; 但是默认实现它们的过滤器只有三种&#xff0c;分别是ActionFilter&#xff08;方法&#xff09;&#xff0c;Authorize&#xff08;授…

Visual Studio2010源码编译curl_7_60

一、源码解压目录内容 很开心里面可以找到CMakeLists.txt文件&#xff0c;说明可以实用CMake工具进行构建&#xff0c;由于多数开源项目都选择实用CMake作为构建编译工具&#xff0c;大家蝇该都比较熟练了。 二、实用CMake开始构建Visual Studio 2010工程 很顺利整个构建过程没…

数据分析(2)

数据分析&#xff08;2&#xff09; 本文介绍pandas的另一种数据类型DataFrame,中文叫数据框 DataFrame 定义&#xff1a; DataFrame是一个二维的矩阵数据表&#xff0c;通过行和列&#xff0c;可以定位一个值。 在某种程度上&#xff0c;可以认为DataFrame是“具有相同ind…

2024蓝桥杯每日一题(组合计数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;计算系数 试题二&#xff1a;求组合数1 试题三&#xff1a;求组合数2 试题四&#xff1a;杨辉三角形 试题一&#xff1a;计算系数 【题目描述】 给定一个多项式 (axby)k&#xff0c;请…

Web3.0与AI的交融:开启智能互联网新时代

目前有140 多个 Web3 AI 概念项目&#xff0c;覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…

【云计算】混合云分类

《混合云》系列&#xff0c;共包含以下 3 篇文章&#xff1a; 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f68…

HarmonyOS开发实例:【分布式邮件】

概述 基于TS扩展的声明式开发范式编程语言编写的一个分布式邮件系统&#xff0c;可以由一台设备拉起另一台设备&#xff0c;每次改动邮件内容&#xff0c;都会同步更新两台设备的信息。效果图如下&#xff1a; 搭建OpenHarmony开发环境 完成本篇Codelab我们首先要完成开发环境…

智慧电网数据可视化运维云平台解决方案

智慧电力概述 智慧电力是通过采用先进的大数据、云计算、物联网、边缘计算等技术&#xff0c;实现生产信息与管理信息的智慧&#xff0c;实现人、技术、经营目标和管理方法的集成&#xff0c;是企业管理思想的一个新突破。智慧电厂建设具备智能化、一体化、可观测、可互动、自…

RAKsmart:硅谷裸机云多IP服务器性能评测

在云计算领域&#xff0c;裸机云作为一种结合了传统物理服务器与云计算优势的服务模式&#xff0c;近年来备受关注。硅谷裸机云作为业界佼佼者&#xff0c;以其出色的性能和稳定性赢得了众多用户的青睐。今天&#xff0c;我们就来评测一下硅谷裸机云的多IP服务器性能。 首先&am…

WPF Extended.Wpf.Toolkit 加载界面

1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接&#xff1a;Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好&#xff0c;我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的&#xff0c;它是一种点对点的通信技术&#xff0c;通过浏览器之间建立对等连接&#xff0c;实现音频…

常见的领域驱动设计架构

常见的领域驱动设计架构有经典的三层架构、REST架构、事件驱动架构、CQRS架构、六边形架构等。 当谈到领域驱动设计&#xff08;DDD&#xff09;时&#xff0c;通常会提到一些常见的架构模式&#xff0c;它们有助于组织和管理应用程序的结构&#xff0c;以支持领域驱动设计的实…

Spring Boot JNA 实现调用 DLL文件(清晰明了)

概述 项目需要用到 重采样算法&#xff0c;JAVA 没有现成的&#xff0c;只能通过 JNA 调用 C 的 DLL 实现&#xff0c;JNA中&#xff0c;它提供了一个动态的C语言编写的转发器&#xff0c;可以自动实现Java和C的数据类型映射。不再需要编写C动态链接库。 实现需求 根据 一个…

python标准库常用方法集合

前段时间准备第十五届蓝桥杯python a组&#xff0c;因为赛中不允许导包&#xff0c;因此对py中的标准库进行了笔记和总结&#xff0c;即不导包即可使用的常用方法。包含了内置函数、math、random、datetime、os、sys、re、queue、collections、itertools库的常用方法&#xff0…

滤波器笔记(杂乱)

线性相位是时间平移&#xff0c;相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…