news 2026/6/15 20:42:48

代码随想录算法训练营第四十四天 | 99.岛屿数量 深搜 99.岛屿数量 广搜 100. 岛屿的最大面积

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录算法训练营第四十四天 | 99.岛屿数量 深搜 99.岛屿数量 广搜 100. 岛屿的最大面积

版本一的写法是 :下一个节点是否能合法已经判断完了,传进dfs函数的就是合法节点。

版本二的写法是:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再return。

我在之前回溯算法做过笔记,我更偏好版本一。

xy老让我联想到坐标,我就不用xy了。也可以叫row、col。

package main import ( "bufio" "fmt" "os" ) var dir = [4][2]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} func main() { in := bufio.NewReader(os.Stdin) var n, m int fmt.Fscan(in, &n, &m) grid := make([][]int, n) visited := make([][]bool, n) for i := range grid { grid[i] = make([]int, m) } for i := range visited { visited[i] = make([]bool, m) } for i := range grid { for j := range grid[i] { fmt.Fscan(in, &grid[i][j]) } } res := 0 for i := range grid { for j := range grid[i] { if grid[i][j] == 1 && !visited[i][j] { res++ visited[i][j] = true dfs(grid, visited, i, j) } } } fmt.Println(res) } func dfs(grid [][]int, visited [][]bool, i, j int) { for k := 0; k < 4; k++ { nextI := i + dir[k][0] nextJ := j + dir[k][1] if nextI < 0 || nextI >= len(grid) || nextJ < 0 || nextJ >= len(grid[0]) { continue } if grid[nextI][nextJ] == 1 && !visited[nextI][nextJ] { visited[nextI][nextJ] = true dfs(grid, visited, nextI, nextJ) } } }

如果节点出队列再标记为已访问过,会导致相同的节点重复入队列,进而导致队列中会有大量的重复节点。

package main import ( "bufio" "fmt" "os" ) var dir = [4][2]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} func main() { in := bufio.NewReader(os.Stdin) var n, m int fmt.Fscan(in, &n, &m) grid := make([][]int, n) visited := make([][]bool, n) for i := range grid { grid[i] = make([]int, m) } for i := range visited { visited[i] = make([]bool, m) } for i := range grid { for j := range grid[i] { fmt.Fscan(in, &grid[i][j]) } } res := 0 for i := range grid { for j := range grid[i] { if grid[i][j] == 1 && !visited[i][j] { res++ visited[i][j] = true bfs(grid, visited, i, j) } } } fmt.Println(res) } type Pair struct { i, j int } func bfs(grid [][]int, visited [][]bool, row, col int) { q := make([]Pair, 0) q = append(q, Pair{row, col}) visited[row][col] = true for len(q) != 0 { cur := q[0] q = q[1:] for k := 0; k < 4; k++ { nextI := cur.i + dir[k][0] nextJ := cur.j + dir[k][1] if nextI < 0 || nextI >= len(grid) || nextJ < 0 || nextJ >= len(grid[0]) { continue } if grid[nextI][nextJ] == 1 && !visited[nextI][nextJ] { q = append(q, Pair{nextI, nextJ}) visited[nextI][nextJ] = true } } } }

easy

package main import ( "bufio" "fmt" "os" ) var dir = [4][2]int{{0, 1}, {1, 0}, {-1, 0}, {0, -1}} var count int func main() { in := bufio.NewReader(os.Stdin) var n, m int fmt.Fscan(in, &n, &m) grid := make([][]int, n) visited := make([][]bool, n) for i := range grid { grid[i] = make([]int, m) } for i := range visited { visited[i] = make([]bool, m) } for i := range grid { for j := range grid[i] { fmt.Fscan(in, &grid[i][j]) } } res := 0 for i := range grid { for j := range grid[i] { if grid[i][j] == 1 && !visited[i][j] { visited[i][j] = true count = 1 dfs(grid, visited, i, j) if count > res { res = count } } } } fmt.Println(res) } func dfs(grid [][]int, visited [][]bool, i, j int) { for k := 0; k < 4; k++ { nextI := i + dir[k][0] nextJ := j + dir[k][1] if nextI < 0 || nextI >= len(grid) || nextJ < 0 || nextJ >= len(grid[0]) { continue } if grid[nextI][nextJ] == 1 && !visited[nextI][nextJ] { visited[nextI][nextJ] = true count++ dfs(grid, visited, nextI, nextJ) } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:26:50

孩子已经近视了,怎样才能控制度数不再加深?

孩子近视了&#xff0c;很多家长最担心的就是度数每年都在涨。作为一个长期关注儿童视力健康的博主&#xff0c;今天我要分享一些真正有效的科学防控方法&#xff0c;帮助孩子们控制近视度数加深。在深入了解控制方法前&#xff0c;我们先要明白近视加深的根本原因。当孩子长时…

作者头像 李华
网站建设 2026/6/15 15:02:04

全基因组重测序上游分析流程--随笔15

全基因组重测序上游分析流程&#xff5c;从软件部署到变异检测&#xff0c;超细致实操指南 作为科研新手&#xff0c;第一次上手全基因组重测序数据处理时&#xff0c;我踩过不少软件安装的坑、碰过参数设置的雷。如今整理出这份超详细流程&#xff0c;从前期准备到最终变异过…

作者头像 李华
网站建设 2026/6/15 12:22:04

中间件开发与生命周期管理

目录中间件开发与生命周期管理1. 引言&#xff1a;中间件的重要性 {#引言}2. 中间件的基本概念与原理 {#基本概念}2.1 中间件的定义与分类2.2 中间件的核心特征3. 中间件的生命周期模型 {#生命周期模型}3.1 生命周期的五个阶段3.2 状态转移矩阵3.3 生命周期时长模型4. 中间件开…

作者头像 李华
网站建设 2026/6/15 18:53:44

2026大专建筑工程必看!这些证书让你找工作不踩雷!

各位建工专业的同学们&#xff0c;2026年的建筑行业正在经历深刻转型。“大干快上”的时代过去了&#xff0c;现在是拼技术、拼管理、拼合规的时代。作为大专生&#xff0c;我们学历上不占优&#xff0c;但恰恰可以通过实操技能和专业证书&#xff0c;在施工现场打出一片天。今…

作者头像 李华
网站建设 2026/6/15 17:58:25

《UGC工具的能力梯度解锁指南》

很多产品陷入“功能越多越强大”的误区,却忽略了用户在碎片化场景下的核心诉求—当一位博主在通勤途中想用手机编辑图文时,过多的排版选项会成为认知负担,而过于简化的功能又无法满足专业表达需求。这就需要建立“感知负荷拆解模型”,将复杂功能拆解为“基础必选”“进阶可…

作者头像 李华