代码随想录day52 || 图论搜索 岛屿数量,岛屿的最大面积

news/2024/11/15 14:25:13/文章来源:https://www.cnblogs.com/zhougongjin55/p/18398280

图遍历

dfs 深度优先搜索

image

bfs 广度优先搜索

image

200 岛屿数量(dfs)

var dirPath = [][]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}} // 上, 右, 下, 左
var visited [][]bool
func numIslands(grid [][]byte) int {// dfs 深度优先遍历,对于每一个节点,按照上下左右四个固定顺序遍历,然后到下一个节点递归,实现一条路走到黑// 重新初始化,避免多个测试样例导致出现全局变量污染情况visited = make([][]bool, len(grid))for idx, _ := range visited {visited[idx] = make([]bool, len(grid[0]))}var res intfor i:=0; i<len(grid); i++ {for j:=0; j<len(grid[0]); j++ {if grid[i][j] != '0' && !visited[i][j] {  // 是陆地并且没被遍历过dfs(grid, i, j)}else{continue}if visited[i][j] { // 是陆地,并且被标记了,这里的标记会遍历整个四周陆地,并且为周边陆地打上标记,所以不会出现同一陆地多个地块都被计数res += 1}}}return res
}
func dfs(grid [][]byte, x, y int) {// 遇到之前节点或者水,返回if grid[x][y] == '0' || visited[x][y] == true {visited[x][y] = true  // 优化,不是陆地也标记遍历过,防止出现多次对水进行重复遍历return}visited[x][y] = true  // 本节点是陆地并且标记为已经遍历过// 按照四个方向遍历到下一个节点,然后递归,实现一条路走到黑之后回溯,由于不需要路径,所以回溯过程视为隐藏for _, v := range dirPath {next_x, next_y := x+v[0], y+v[1] // 要遍历的下一个节点if next_x < 0 || next_x >= len(grid) || next_y < 0 || next_y >= len(grid[0]) {  // 避免出现节点越界情况continue}// 加入dfs(grid, next_x, next_y)// 回溯}return
}

岛屿数量(bsf)

var dirPath = [][]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}} // 上, 右, 下, 左
var visited [][]bool
var queue *list.List
func numIslands(grid [][]byte) int {// 重新初始化,避免多个测试样例导致出现全局变量污染情况queue = list.New()visited = make([][]bool, len(grid))for idx, _ := range visited {visited[idx] = make([]bool, len(grid[0]))}var res intfor i:=0; i<len(grid); i++ {for j:=0; j<len(grid[0]); j++ {if grid[i][j] != '0' && !visited[i][j] {  // 是陆地并且没被遍历过queue.PushBack([2]int{i, j})visited[i][j] = truebfs(grid)}else{continue}if visited[i][j] { // 本质上多余这一步判断,方便理解放进去了// 是陆地,并且被标记了,这里的标记会遍历整个四周陆地,并且为周边陆地打上标记,所以不会出现同一陆地多个地块都被计数res += 1}}}return res
}
func bfs(grid [][]byte) {for queue.Len() > 0 { // 一个岛屿的完成遍历过程就是整个队列完全为空node := queue.Remove(queue.Front()).([2]int) // 去除队首,断言为长度为2数组for _, v := range dirPath {  // 遍历四个节点标记入队next_x, next_y := node[0] + v[0], node[1] + v[1]if next_x < 0 || next_x >= len(grid) || next_y < 0 || next_y >= len(grid[0]) {  // 避免越界continue}if visited[next_x][next_y] { // 节点被使用过,过continue}// 先标记再入队,可以避免很多重复遍历,例如如果节点是0,不标记已经遍历过,那么bfs中也要遍历多次,主函数两层for循环也要遍历多次,容易超时visited[next_x][next_y] = trueif grid[next_x][next_y] == '1'{queue.PushBack([2]int{next_x, next_y})}}}
}

岛屿最大面积(dfs)

var dirPath = [4][2]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}} // 上右下左
var visited [][]bool
var area int
func maxAreaOfIsland(grid [][]int) int {visited = make([][]bool, len(grid))for idx, _ := range visited {visited[idx] = make([]bool, len(grid[0]))}var maxArea intfor i:=0; i<len(grid); i++ {for j:=0; j<len(grid[0]); j++{if !visited[i][j] && grid[i][j] == 1{area = 1dfs(grid, i, j)maxArea = max(area, maxArea)}}}return maxArea
}func dfs(grid [][]int, x, y int) {if visited[x][y] || grid[x][y] == 0 { // 如果是水,标记返回,或者如果是标记过,也直接返回visited[x][y] = truereturn}visited[x][y] = true // 此时是陆地,标记for _, dir := range dirPath {next_x, next_y := dir[0] + x, dir[1] + yif next_x < 0 || next_x >= len(grid) || next_y < 0 || next_y >= len(grid[0]) {continue}if grid[next_x][next_y] == 1 && !visited[next_x][next_y]{area++dfs(grid, next_x, next_y)}}
}

岛屿最大面积(bfs)

var dirPath = [4][2]int{{0, -1}, {1, 0}, {0, 1}, {-1, 0}} // 上右下左
var visited [][]bool
var queue *list.List
func maxAreaOfIsland(grid [][]int) int {visited = make([][]bool, len(grid))for idx, _ := range visited {visited[idx] = make([]bool, len(grid[0]))}queue = list.New()var maxArea intfor i:=0; i<len(grid); i++ {for j:=0; j<len(grid[0]); j++{if !visited[i][j] && grid[i][j] == 1{visited[i][j] = truequeue.PushBack([2]int{i, j})area := bfs(grid)maxArea = max(area, maxArea)}}}return maxArea
}func bfs(grid [][]int) int {var area int = 1for queue.Len() >0 {node := queue.Remove(queue.Front()).([2]int)for _, dir := range dirPath{next_x, next_y := node[0] + dir[0], node[1] + dir[1]if next_x < 0 || next_x >= len(grid) || next_y < 0 || next_y >= len(grid[0]) { // 越界continue}if grid[next_x][next_y] == 1 && !visited[next_x][next_y] {area++queue.PushBack([2]int{next_x, next_y})}visited[next_x][next_y] = true}}return area
}

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

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

相关文章

采购订单的审批、撤回审批及拒绝 ME29N

原文链接:https://blog.csdn.net/z_x_xing_/article/details/90201003 前台操作,如下图:点击图中的批准按钮,逐级完成采购订单的审批节点。2.查看表中数据发布状态——对应前台界面当前已审批的节点BAPI使用 CALL FUNCTION BAPI_PO_RELEASE EXPORTING PURCHASEORDE…

会话状态在此上下文中不可用——解决方法

原文链接:https://www.cnblogs.com/lczblog/p/3596481.html问题原因分析:项目中包含各种类型的文件 访问.html的时候无法获取Session 解决办法:在上图中出现错误之前添加判断 当访问的是.aspx类型的文件时在访问Session if (!application.Context.Handler.ToString().EndsWi…

naocs 作为服务注册与发现和配置中心

下载和安装 国内的软件,去官网下就行了,下载好后到其 bin 目录执行命令 startup.cmd -m standalone 服务就会启动浏览器访问,能访问到 nacos 界面小试牛刀工程导入依赖 <!-- 当前服务注册到 nacos 需要 --> <dependency><groupId>com.alibaba.cloud</g…

consul 作为服务注册与发现和配置中心

下载安装下载地址:https://developer.hashicorp.com/consul/install?product_intent=consul解压出来只有个 exe 文件,在这个目录打开 shell,consul --version 查看版本,consul agent -dev 开发模式启动启动后访问 localhost:8500 能正常访问到 consul 界面小试牛刀工程导入…

【工具使用】【EasyExcel 】EasyExcel 实现 Excel 作者信息、版本信息等的写入和读取

1 前言 导入的功能,想必大家都做过,大家肯定也都遇到过比如我的模板变化了(比如新增一列、删除一列等),客户在使用的时候可能还是用的老模板进行导入,那么我们在写代码的时候,应该怎么快速识别到呢? 比如可以比较客户导入的 Excel 一列一列的去比较或者列的个数等是可…

查看pdf的字体,导出电脑的字体

1、 查看PDF文件的使用字体: ⑴、打开PDF文件,右上角,点击【文件】⑵、打开属性⑶、查看字体字体结果:2、 导出字体 ⑴、打开控制面板,小图标下面选择字体⑵、打开字体,查看方式改成【详细信息】,按照名称排序⑶、找到字体缩小窗口,点击字体,拖到桌面上就行了

Exchange 2016部署实施案例篇-04.Ex基础配置篇(中)

昨天更新了基础配置的上篇《Exchange 2016部署实施案例篇-04.Ex基础配置篇(上)》,欢迎各位老铁多多提出宝贵意见,非常感谢。 虚拟目录 自动发现配置有的朋友可能知道,虽然在虚拟目录里有自动发现这个选项,但自动发现记录在图形化界面无法配置自动发现地址,如图所示 其实…

一个故事理解消息队列-下

这是一篇迟到一月有余的文章。 在7月18号,我用了一个故事作为案例,介绍了消息队列的基本功能和应用场景。本打算第二天介绍消息队列的主要功能特性的,由于文章排期等其他因素影响,顾更新搁置了。 这篇文章,接上篇《一个故事理解消息队列-上》,以Kafka为例,为大家介绍消息…

开源文档管理系统 MinDoc 安装和使用教程

说到文档管理,很多团队的文档管理都是一团糟,每个员工在自己本地写了各种 Word 文档、Excel 表格、甚至还有手写的便签,到处都是,找起来就像大海捞针。有些聪明的团队开始用飞书来管理团队文档,但是并不适合所有团队,有的团队可能更倾向于使用开源的方案。今天就给大家介…

解决idea创建版本时只有Java21和Java17选项

你是否在使用IntelliJ IDEA创建新项目时遇到了只有Java 21和Java 17的选项?别担心,我们的指南将为你提供解决方案,通过简单的步骤,你将能够选择你需要的任何Java版本,继续阅读,让我们开始吧!idea如果版本高了就会出现在创建Springboot项目时只有Java21和Java17选项 选择jdk1.…

短视频获客系统市场分析和竞品分析

在当前经济环境下,各行各业都面临着严峻的获客挑战。无论是中小企业、大型企业,还是新兴的互联网行业,都在努力寻找更加高效的获客途径,说明企业迫切需要一套创新的获客系统来解决这些难题。 1、市场分析 互联网的快速发展极大地改变了企业的运营模式,尤其是在客户获取方面…

Yolov8-源码解析-四十四-

Yolov8 源码解析(四十四) .\yolov8\ultralytics\utils\triton.py # Ultralytics YOLO 🚀, AGPL-3.0 license# 引入必要的类型 from typing import List # 解析 URL 的组件 from urllib.parse import urlsplit# 引入 NumPy 库 import numpy as npclass TritonRemoteModel:&q…