力扣爆刷第145天之图论五连刷(dfs和bfs)

力扣爆刷第145天之图论五连刷(dfs和bfs)

文章目录

      • 力扣爆刷第145天之图论五连刷(dfs和bfs)
      • 总结
      • 一、797. 所有可能的路径
      • 二、200. 岛屿数量
      • 三、695. 岛屿的最大面积
      • 四、1020. 飞地的数量
      • 五、130. 被围绕的区域

总结

dfs是一条路走到底,类似于树的遍历,即一直递归,直至终点。
bfs是一圈一圈的往外遍历,类似于树的水平遍历,一般使用队列来做。(bfs适合来求两点之间的最短路径)。

一、797. 所有可能的路径

题目链接:https://leetcode.cn/problems/all-paths-from-source-to-target/description/
思路:本题求所有可能的路径,从0到n-1节点的路径,本题是有向无环图,让我们搜索所有的路径,本质上和遍历树没啥区别,只不过是多叉树,寻找路径自然是深度优先,为了能在递归返回时再记录其他的路径,自然要使用回溯,那么本题就是dfs然后加上回溯,本质上来说,回溯也是深度优先。不过本题是有向无环图,且定向路径,不需要去重。

class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> list = new ArrayList<>();public List<List<Integer>> allPathsSourceTarget(int[][] graph) {list.add(0);dfs(graph, 0);return result;}void dfs(int[][] graph, int start) {if(graph.length-1 == start) {result.add(new ArrayList(list));return;}for(int i = 0; i < graph[start].length; i++) {list.add(graph[start][i]);dfs(graph, graph[start][i]);list.remove(list.size()-1);}}
}

二、200. 岛屿数量

题目链接:https://leetcode.cn/problems/number-of-islands/description/
思路:dfs和bfs都可以,这里使用dfs,外部遍历,只要是岛屿就计数并进行dfs,在进行dfs的过程中,只要是岛屿就设置为海洋,然后向周围四个方向进行dfs,这样一次递归返回,即可标记一个岛。

class Solution {public int numIslands(char[][] grid) {int sum = 0;for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == '1') {dfs(grid, i, j);sum++;}}}return sum;}void dfs(char[][] grid, int x, int y) {if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == '0') return ;grid[x][y] = '0';dfs(grid, x+1, y);dfs(grid, x-1, y);dfs(grid, x, y+1);dfs(grid, x, y-1);}}

三、695. 岛屿的最大面积

题目链接:https://leetcode.cn/problems/max-area-of-island/description/
思路:求岛屿的最大面积和上一题是类似,上一题是求岛屿的数量,本题只需要在每一次对一个岛屿进行dfs时进行累加,遍历完再记录最大值,清空记录值,以此往复即可。

class Solution {int max = 0, k = 0;public int maxAreaOfIsland(int[][] grid) {for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == 1) {k = 0;dfs(grid, i, j);max = Math.max(max, k);}}}return max;}void dfs(int[][] grid, int x, int y) {if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0) return;k++;grid[x][y] = 0;dfs(grid, x-1, y);dfs(grid, x+1, y);dfs(grid, x, y-1);dfs(grid, x, y+1); }
}

四、1020. 飞地的数量

题目链接:https://leetcode.cn/problems/number-of-enclaves/description/
思路:求飞地的数量,本题也是dfs,看看只要掌握了dfs常见的图论的题目都可以做,本题对飞地的顶用是不与边界接壤的土地,本质上还是求所有岛屿的面积,只不过在记录的过程中需要一个标志位记录该岛屿是否是飞地,只有是飞地,面积才会累加。

class Solution {boolean flag = true;int count = 0, k = 0;public int numEnclaves(int[][] grid) {for(int i = 0; i < grid.length; i++) {for(int j = 0; j < grid[0].length; j++) {if(grid[i][j] == 1) {k = 0;flag = true;dfs(grid, i, j);if(flag) count += k; }}}return count;}void dfs(int[][] grid, int x, int y) {if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0) return;if(x == 0 || x == grid.length-1 || y == 0 || y == grid[0].length-1) flag = false;k++;grid[x][y] = 0;dfs(grid, x-1, y);dfs(grid, x+1, y);dfs(grid, x, y-1);dfs(grid, x, y+1);}
}

五、130. 被围绕的区域

题目链接:https://leetcode.cn/problems/surrounded-regions/description/
思路:也是经典的海岛问题,和上一题不一样的是,让把节点相接壤的区域给保留下来,只需要先沿着边界递归,把与边界相接壤的岛屿先设置为一种标记,然后全文遍历,把不接壤的设置为海洋,再把接壤的给还原回来。

class Solution {public void solve(char[][] board) {int m = board.length, n = board[0].length;for(int i = 0; i < m; i++) {dfs(board, i, 0);dfs(board, i, n-1);}for(int i = 0; i < n; i++) {dfs(board, 0, i);dfs(board, m-1, i);}for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {if(board[i][j] == 'O') board[i][j] = 'X';if(board[i][j] == 'A') board[i][j] = 'O';}}}void dfs(char[][] board, int x, int y) {if(x < 0 || x >= board.length || y < 0 || y >= board[0].length || board[x][y] != 'O') return;board[x][y] = 'A';dfs(board, x-1, y);dfs(board, x+1, y);dfs(board, x, y-1);dfs(board, x, y+1);}
}

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

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

相关文章

Debug - nacos配置 第二弹

好的 又是一个蠢蠢的 nacos 配置上出现的问题 在使用 nacos 进行 配置共享时 报错 Description: Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver c…

5.30边缘智能开发工具链全解析 | 2024高通边缘智能创新应用大赛公开课

2024高通边缘智能创新应用大赛系列公开课迎来精彩续篇&#xff01;本期课程将由阿加犀智能科技技术总监秦朝&#xff0c;为大家带来一场关于边缘智能方案与创新应用的深度分享。 作为本次大赛的联合主办方&#xff0c;阿加犀为比赛设备提供强大的软件支持。 各位参赛者将上手…

谷歌忙于手动删除自己搜索引擎中奇怪的人工智能答案

该公司确认正在“迅速采取行动”消除人工智能工具的一些奇怪反应。 社交媒体上充斥着谷歌新的人工智能概述产品的例子&#xff0c;这些产品说了一些奇怪的话&#xff0c;从告诉用户在披萨上涂胶水到建议他们吃石头。混乱的推出意味着&#xff0c;随着各种表情包的发布&#xf…

Android Gradle文件 一次通关

前言 Android的Gradle是每个项目一定包含的文件&#xff0c;用来定义构建配置的脚本文件&#xff0c;通常包括两个主要文件&#xff1a;build.gradle&#xff08;项目级别&#xff09;和build.gradle&#xff08;模块级别&#xff09;。 项目级别的 build.gradle 文件 项目级…

【Typescript】通过变量的值即可获取变量的类型【typeof 变量】

注意&#xff1a;只要变量的类型准确,则typeof获取变量的类型就不会错 enum Test {a "a0",b "b0" }// 这里的a是一个变量的值 let a: Test.a "a0" as Test.a// 这里的typeof a是一个类型【Test.a】 let x: typeof a Test.a

C++系列-定位new表达式(placement-new)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们先来强调一个很关键的问题&#xff0c;那就是在new和delete中的一一对应的问题&#xff0c; 我们先来看一段代码&#xff1a; #include<iostream> using namespace …

【C++】旋转字符串——精准与否,就是屠宰和手术的区别

✨题目链接&#xff1a; NC114 旋转字符串 ✨题目描述 字符串旋转: 给定两字符串A和B&#xff0c;如果能将A从中间某个位置分割为左右两部分字符串&#xff08;可以为空串&#xff09;&#xff0c;并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回t…

北理工提出 LTrack 双摄像头系统 | 专注于暗场景多目标跟踪,自动驾驶和夜间监控的福音!

低光照场景在现实世界应用中很普遍&#xff08;例如自动驾驶和夜间监控&#xff09;。最近&#xff0c;在各种实际用例中的多目标跟踪受到了很多关注&#xff0c;但在暗场景中的多目标跟踪却鲜少被考虑。 在本文中&#xff0c;作者专注于暗场景中的多目标跟踪。为了解决数据集…

shell脚本读写二进制文件

文章目录 shell脚本读写二进制文件读取二进制文件使用xxd命令使用od命令 写入二进制文件使用echo和printf 读取和修改二进制文件使用dd命令 组合使用工具 shell脚本读写二进制文件 在Shell脚本中处理二进制文件时&#xff0c;可以使用一些常用的命令和工具来读取和写入二进制数…

短视频真人配音:成都科成博通文化传媒公司

短视频真人配音&#xff1a;情感传递的新维度 随着数字化媒体的飞速发展&#xff0c;短视频已经成为人们日常生活中不可或缺的一部分。而在这个视觉盛宴的时代&#xff0c;真人配音的加入为短视频注入了新的活力&#xff0c;不仅丰富了内容形式&#xff0c;更使得情感传递达到…

ymysql.err.OperationalError: (1049, “Unknown database ‘testdb‘“)

这个错误信息表明你的代码尝试连接到名为 testdb 的数据库&#xff0c;但该数据库不存在。你需要在 MySQL 服务器上创建这个数据库&#xff0c;或者更改你的代码以连接到已存在的数据库。以下是创建数据库的步骤&#xff1a; 1、使用 MySQL 客户端&#xff1a; 打开终端或命令…

怎样在网上赚点零花钱?推荐十个正规的赚钱兼职平台

今天要和大家探讨一个激动人心的话题——网络赚钱。在这个互联网日新月异的时代&#xff0c;网络赚钱已经变成了触手可及的现实。如果你正打算在网上赚取一些额外收入&#xff0c;那么这篇文章绝对值得一读&#xff01; 在这个信息泛滥的时代&#xff0c;网络赚钱的机遇随处可…

JavaScript或其他编程语言中关于函数的各种高级特性和设计模式

重载函数&#xff08;Overloaded Function&#xff09;: 在一些静态类型的语言&#xff08;如Java、C&#xff09;中&#xff0c;函数重载允许在同一作用域内定义多个同名函数&#xff0c;但每个函数的参数列表不同。JavaScript本身不支持函数重载&#xff0c;但是可以通过检查…

全方位质量保障!龙蜥在内核、软件包、容器镜像、三方模块的 CI 工程实践

编者按&#xff1a;在海量的代码测试和构建中&#xff0c; CI(Continuous Integration)在代码提交阶段&#xff0c;对提高软件质量和开发效率起到了至关重要的作用。2023 龙蜥操作系统大会全面繁荣开发者生态分论坛上&#xff0c;龙蜥社区 QA SIG Maintainer、联通数科 CUlinux…

ai发展会不会带来企业的员工垄断呢

写代码写累了&#xff0c;写点个人不成熟的想法&#xff0c;作为记录 随着gpt-4o发布&#xff0c;可以预计的是&#xff0c;AI逐渐能够通过各种外接设备和传感器和真实世界实时交互。那么未来一个接上摄像头&#xff0c;键盘&#xff0c;音响&#xff0c;可移动身体的的AI还会…

左外连接和右外连接的区别?举例说明——以力扣sql 1378. 使用唯一标识码替换员工ID为例

左外连接&#xff08;LEFT JOIN&#xff09;和右外连接&#xff08;RIGHT JOIN&#xff09;的主要区别在于哪个表的所有行会保留在结果集中 1. 左外连接 (LEFT JOIN) 左外连接会返回左表中的所有行以及右表中符合连接条件的行。如果右表中没有匹配的行&#xff0c;结果集中右…

内存泄漏案例分享1—Activity或Fragment的内存泄漏

背景 笔者优化音乐App内存泄漏时候&#xff0c;遇到了3个典型内存泄漏&#xff0c;泄漏的内存为39kb&#xff0c;一次39KB看上去不多&#xff0c;积少成多很有可能导致OOM&#xff0c;值得重视。 PS&#xff1a;文末有优化方案&#xff0c;优化后内存减少至原先的150分之一。 …

“不是我兄弟”!刘强东内部“狼性训话”流出!

今天&#xff0c;京东创始人刘强东5月24日的线上讲话流出。 在这次线上讲话中&#xff0c;刘强东首先宣布为全体采销员工涨薪20%—100%&#xff0c;随后进行了一番“狼性训话”。往期报道可戳&#xff1a;刘强东怒了&#xff1a;“不是我兄弟”&#xff01; 刘强东在讲话中指…

【Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题&#xff1a;2.3.1 面试题一&#xff1a;2.3.2 面试题二&#xff1a;2.3.3 面试题三&#xff1a;2.3.4 面试题四&#xff1a; 2.4 String类字符串用于比较的方法2.5 String类字…

如何使用DevEco Studio创建Native C++应用

简介 本篇主要介绍如何使用DevEco Studio for OpenAtom OpenHarmony &#xff08;以下简称“OpenHarmony”&#xff09;创建一个Native C应用。应用采用“Native C”模板&#xff0c;实现了通过Node-API调用C标准库的功能。本示例通过调用C标准库接口来演示调用过程&#xff0…