可视化图解算法56:岛屿数量

牛客网 面试笔试 TOP101

1. 题目

描述

给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。

岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。

例如:

输入

\[1,1,0,0,0\], \[0,1,0,1,1\], \[0,0,0,1,1\], \[0,0,0,0,0\], \[0,0,1,1,1

]

对应的输出为3

(注:存储的01数据其实是字符'0','1')

示例1

输入:

复制代码
[ 
  [1,1,0,0,0],
  [0,1,0,1,1],
  [0,0,0,1,1],
  [0,0,0,0,0],
  [0,0,1,1,1]
]

返回值:

复制代码
3
示例2

输入:

复制代码
[
  [0]
]

返回值:

复制代码
0
示例3

输入:

复制代码
[
  [1,1],
  [1,1]
]

返回值:

复制代码
1

备注:

复制代码
01矩阵范围<=200*200

2. 解题思路

岛屿数量的计算可以通过遍历+递归的形式完成,具体思路如下:

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心代码如下:

Go 复制代码
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 判断岛屿数量
 * @param grid char字符型二维数组
 * @return int整型
 */
func solve(grid [][]byte) int {
	// write code here
	count := 0 //岛屿个数
	//遍历二维数组的每一个元素 统计岛屿的个数
	for i := 0; i < len(grid); i++ {
		for j := 0; j < len(grid[0]); j++ {
			if grid[i][j] == '1' {
				//如果当前元素是1,岛屿的数量加1
				count++
				//递归处理岛屿(相邻的设置为0:因为该岛屿已经计算过)
				dfs(grid, i, j)
			}
		}
	}
	return count
}

// 把当前元素以及他邻近的为1的元素都置为0
func dfs(grid [][]byte, i int, j int) {
	// 2.递归终止条件:边界条件判断,不能越界; grid[i][j] == '0':非岛屿,返回
	if (i < 0 || i >= len(grid)) || (j < 0 || j >= len(grid[0])) || (grid[i][j] == '0') {
		return
	}

	// 1. 递归步骤
	// 1.1 设置当前岛屿置位0(已经计算过)
	grid[i][j] = '0'
	// 1.2 对上、下、左、右 连着的4个方向进行递归处理(如果为岛屿,即 grid[i][j] == '1',置0)
	dfs(grid, i-1, j) //上
	dfs(grid, i+1, j) //下
	dfs(grid, i, j-1) //左
	dfs(grid, i, j+1) //右
}

具体完整代码你可以参考下面视频的详细讲解。

4.小结

岛屿的计算方法为:遍历二维数组中的每一个元素,如果是1则岛屿计数,同时通过递归的方式将连接的岛屿(相邻元素为1值)设置为海洋(元素值设置为0,因为该岛屿已经计算过)。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

✅ 链表

✅ 二叉树

✅ 二分查找、排序

✅ 堆、栈、队列

✅ 回溯算法

✅ 哈希算法

✅ 动态规划

无论你是备战笔试面试 、提升代码效率 ,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:世异则事异,事异则备变。

相关推荐
gaoshou4511 分钟前
代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字
数据结构·算法
自信的小螺丝钉18 分钟前
Leetcode 240. 搜索二维矩阵 II 矩阵 / 二分
算法·leetcode·矩阵
闪电麦坤9519 分钟前
数据结构:深度优先搜索 (Depth-First Search, DFS)
数据结构·深度优先
KING BOB!!!2 小时前
Leetcode高频 SQL 50 题(基础版)题目记录
sql·mysql·算法·leetcode
我是渣哥2 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
THMAIL2 小时前
机器学习从入门到精通 - 机器学习调参终极手册:网格搜索、贝叶斯优化实战
人工智能·python·算法·机器学习·支持向量机·数据挖掘·逻辑回归
lytk992 小时前
矩阵中寻找好子矩阵
线性代数·算法·矩阵
珊瑚怪人3 小时前
算法随笔(一)
算法
晚安里3 小时前
JVM相关 4|JVM调优与常见参数(如 -Xms、-Xmx、-XX:+PrintGCDetails) 的必会知识点汇总
java·开发语言·jvm·后端·算法
THMAIL4 小时前
机器学习从入门到精通 - 集成学习核武器:随机森林与XGBoost工业级应用
人工智能·python·算法·随机森林·机器学习·集成学习·sklearn