71/300
- 岛屿数量
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
grid = [["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]]
思路:DFS,遇见第一个’1’(记下来),变’0’,然后在此点基础上,dfs来一遍,把所有遇见的’1’都变成’0’,dfs出来后,继续下一个点。
class Solution:
def numIslands(self, grid) -> int:
if not grid: return 0
r, c = len(grid), len(grid[0])
def dfs(grid, i, j):
if i < 0 or j < 0 or i >= r or j >= c or grid[i][j] == '0':
return
grid[i][j] = '0'
list(map(dfs, grid, (i+1, i, i-1, i), (j, j+1, j, j-1)))
count = 0
for i in range(r):
for j in range(c):
if grid[i][j] == '1':
count += 1
dfs(grid, i, j)
return count
大佬的简洁代码:
class Solution:
def numIslands(self, grid) -> int:
def sink(i, j):
if 0 <= i < len(grid) and 0 <= j < len(grid[i]) and grid[i][j] == '1':
grid[i][j] = '0'
list(map(sink, (i+1, i, i-1, i), (j, j+1, j, j-1)))
return 1
return 0
return sum(sink(i, j) for i in range(len(grid)) for j in range(len(grid[i])))