题目-中等难度
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例
示例 1:
示例 2:
提示:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. dfs
时间
108ms
击败 78.12%使用 Python3 的用户
内存
25.87MB
击败 72.49%使用 Python3 的用户
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
# 获取网格长宽
lg,lgg = len(grid),len(grid[0])
# 递归填充网格内为1的项
def dfs(grid,x,y):
# 确保x,y在网格中, 并且当前网格值为1
if (0<=x<lg and 0<=y<lgg and grid[x][y]=='1'):
# 将网格变化为0
grid[x][y] = '0'
# 对相邻网格为1的进行填充
dfs(grid,x+1,y)
dfs(grid,x-1,y)
dfs(grid,x,y+1)
dfs(grid,x,y-1)
# 计数
c = 0
# 遍历网格
for m in range(lg):
for n in range(lgg):
# 若当前网格值为1
if grid[m][n] == '1':
# 递归填充
dfs(grid,m,n)
# 计数+1
c+=1
# 返回计数
return c
2. bfs
时间
112ms
击败 70.03%使用 Python3 的用户
内存
25.75MB
击败 88.17%使用 Python3 的用户
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
# 获取网格长宽
lg,lgg = len(grid),len(grid[0])
# 计算
res = 0
# 遍历网格
for i in range(lg):
for j in range(lgg):
# 如果网格值为1
if grid[i][j] == '1':
# 添加至li列表开始广度优先搜索
li = [(i,j)]
while li:
# 获取当前网格
x,y = li.pop(0)
# 由于广度优先会存在一种情况,如li列表中的网格已经将'1'变为'0'的情况, 所以需要跳过
if grid[x][y] == '0':
continue
# 将当前网格值替换为0
grid[x][y] = '0'
# 对网格进行搜索
for xx,yy in [(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
if 0<=xx<lg and 0<=yy<lgg and grid[xx][yy] == '1':
li.append((xx,yy))
res += 1
return res