题目
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例1:
输入:
11110
11010
11000
00000输出: 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:
BFS
BFS用的是队列。(速度慢)
1. 遍历整块大陆,横着竖着遍历都可以。
2.第一次碰到陆地的时候,就知道这是块岛屿了,所以将这块陆地放入探险队列,岛屿数量加一。
3.然后我们将这块岛屿的陆地探索完。每一次将这块陆地周围(上下左右)的陆地放入队列,然后将这块陆地标记为已探索(这里就直接置为'0'了)。
4.当探险队列为空时,表示这块岛屿的陆地全部被探索完了,我们继续寻找下一块陆地。
(原文链接:https://blog.csdn.net/dongmuyang/article/details/94408324)
解法二:
DFS(栈+递归)(速度快)
1.遍历整块大陆。
2.当遇到为‘1’的点时,以该点为起点进行四邻域深度优先遍历,将遍历到的点都置为‘0’。其为1个岛屿。
3.继续寻找下一块陆地。
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
h = len(grid)
if(h==0):
return 0
w = len(grid[0])
h_stack = []
w_stack = []
num = 0
for i in range(h):
for j in range(w):
if(grid[i][j]=='1'):
h_stack.append(i)
w_stack.append(j)
DFS(grid, h_stack, w_stack, h, w)
num +=1
return num
def DFS(grid, h_stack, w_stack, h, w):
if not h_stack:
return 0
else:
h0 = h_stack[-1]
w0 = w_stack[-1]
h1 = h_stack[-1]-1
w1 = w_stack[-1]-1
h2 = h_stack[-1]+1
w2 = w_stack[-1]+1
if(h1>=0 and grid[h1][w0]=='1'):
grid[h1][w0]='0'
h_stack.append(h1)
w_stack.append(w0)
DFS(grid, h_stack, w_stack, h, w)
if(h2<h and grid[h2][w0]=='1'):
grid[h2][w0]='0'
h_stack.append(h2)
w_stack.append(w0)
DFS(grid, h_stack, w_stack, h, w)
if(w2<w and grid[h0][w2]=='1'):
grid[h0][w2]='0'
h_stack.append(h0)
w_stack.append(w2)
DFS(grid, h_stack, w_stack, h, w)
if(w1>=0 and grid[h0][w1]=='1'):
grid[h0][w1]='0'
h_stack.append(h0)
w_stack.append(w1)
DFS(grid, h_stack, w_stack, h, w)
h_stack.pop()
w_stack.pop()