给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
class Solution:
def depthSearch(self,grid,i,j):
if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]):
return
if grid[i][j] == "0":
return
grid[i][j] = "0"
self.depthSearch(grid,i-1,j)
self.depthSearch(grid,i+1,j)
self.depthSearch(grid,i,j-1)
self.depthSearch(grid,i,j+1)
def numIslands(self, grid: List[List[str]]) -> int:
if not grid:
return 0
w,h = len(grid[0]),len(grid)
cnt = 0
for i in range(h):
for j in range(w):
if grid[i][j] == '1':
self.depthSearch(grid,i,j)
cnt += 1
return cnt
方法二:在图的外侧增加一圈"0", 相当于扩大了整个图,
这样在递归陆地的过程中会节省了判断,并且不用考虑超出范围的问题
class Solution:
def depthSearch(self,grid,i,j):
#如果没有了陆地就返回0
if grid[i][j] == "0":
return
#把陆地变成海洋
grid[i][j] = "0"
#深度搜索四周的陆地
self.depthSearch(grid,i-1,j)
self.depthSearch(grid,i+1,j)
self.depthSearch(grid,i,j-1)
self.depthSearch(grid,i,j+1)
def numIslands(self, grid: List[List[str]]) -> int:
#如果是空图,就返回没有陆地
if not grid:
return 0
#在整个图的四周都加上一个边界,节省了判断,不考虑超出范围的问题
w,h = len(grid[0]),len(grid)
new_grid = [['0' for i in range(w+2)]]
for g in grid:
new_grid.append(["0"] + g + ["0"])
new_grid.append(['0' for i in range(w+2)])
#记录陆地数量
cnt = 0
for i in range(1,h+1):
for j in range(1,w+1):
if new_grid[i][j] == '1':
self.depthSearch(new_grid,i,j)
cnt += 1
return cnt