岛屿数量 递归
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]输出:1
示例 2:
输入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出:3
思路:
岛屿数量这一类题(给一个二维数组,数个数、找路径之类的)考察得还是挺多的,因为这一类题是考察深度优先搜索、宽度优先搜索、递归之类操作的重点。不过这只是我自己大概的一个感觉哈,我们直接来看这个题,每一块挨着的1们就是一个岛屿,我们需要找有几个独立的“1块”即可。
我们可以用非常简单粗暴的方法,因为每一个岛屿周围必然都是0,则我们可以用“炸弹填平法”(我自己起的名哈哈)。我们遍历这个二维数组,每次遇到1,我们就相当于遇到了岛屿,则我们把这个岛屿直接“炸成”海洋,假设我们的炸弹只能以陆地作为介质传播,则炸一次,就可以解决掉一个岛屿,岛屿数量+1。
具体到代码中,由一个位置1向周围扩散,假如是1则变成0再继续扩散,直到扩散不动为止,用递归的方式来做即可。
代码:
class Solution(object):
def numIslands(self, grid):
m = len(grid) #获得二维矩阵的长和宽
n = len(grid[0])
num = [0]#用一个列表充当全局变量
def dfs(i,j):#从i,j这一点开始,对整个岛屿进行填平
if i<0 or i>=m or j<0 or j>=n:#定义base case
return #如果走到了边界外位置直接返回
if grid[i][j]=='1':#如果当前位置是陆地
grid[i][j]=0#填平
#并且向周围四个方向扩散做同样操作
dfs(i-1,j)
dfs(i+1,j)
dfs(i,j-1)
dfs(i,j+1)
for i in range(m):#遍历二维数组当中的每一个位置
for j in range(n):
if grid[i][j]=='1':#如果遇到陆地
dfs(i,j)#通过一个dfs操作,不管岛屿多大都变成海洋
num[0]+=1#解决了一个岛屿,岛屿数量+1
return num[0]
小结:
这道题通过递归解决起来还是挺方便的,不管岛屿多大,都全权交给递归去变成海洋。代码中又一次使用了长度为1的数组充当全局变量这一小技巧,否则容易报找不到变量的问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了