news 2026/5/30 23:53:38

代码随想录算法训练营第四十四天 | 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/5/29 20:08:58

儿童青少年近视该如何科学防控家长是青少年近视防控的“守门人”

儿童青少年近视率的持续攀升&#xff0c;已成为影响国民健康的重要问题。近视不仅会给孩子的学习生活带来不便&#xff0c;还可能随着年龄增长发展为高度近视&#xff0c;引发眼底病变等潜在风险。在近视防控的全过程中&#xff0c;家长作为孩子成长的第一责任人&#xff0c;肩…

作者头像 李华
网站建设 2026/5/29 13:44:46

近视防控看这篇:儿童近视如何干预?什么方法才有效?

如今&#xff0c;儿童近视率逐年攀升&#xff0c;低龄化趋势更是愈演愈烈。不少家长在体检单上看到孩子的视力数值下滑时&#xff0c;满心担忧却不知从何入手。其实家长们要明白&#xff0c;儿童近视干预从来不是 “一招制胜” 的事&#xff0c;更需要融入日常的科学防控。一、…

作者头像 李华
网站建设 2026/5/29 13:58:30

Spring状态机深度解析:从入门到生产实战

Spring State Machine是Spring生态系统中一个强大的状态机框架&#xff0c;它让复杂的状态流转变得优雅而简单。本文将带你从基础概念出发&#xff0c;逐步深入理解并掌握Spring状态机在实际生产环境中的应用。一、状态机是什么&#xff1f;为什么要用它&#xff1f;想象一下订…

作者头像 李华
网站建设 2026/5/29 19:01:02

主流BI工具对比:帆软、Quick BI 与 Tableau 全面解析

在当今数据驱动的时代&#xff0c;企业对数据分析和可视化的需求日益增长。商业智能&#xff08;Business Intelligence, BI&#xff09;工具作为连接数据与决策的桥梁&#xff0c;已成为企业数字化转型的核心组成部分。市场上涌现出众多优秀的BI平台&#xff0c;其中帆软&…

作者头像 李华
网站建设 2026/5/30 20:40:38

GitLab与DeepSeek协同实现MR自动评审实践指南

GitLab与DeepSeek协同实现MR自动评审实践指南摘要本文详细探讨如何利用GitLab的CI/CD能力与DeepSeek智能引擎相结合&#xff0c;构建自动化代码评审系统。该系统能够在合并请求&#xff08;MR&#xff09;提交时自动执行代码质量分析&#xff0c;生成结构化评审报告并提出优化建…

作者头像 李华