统计岛屿数量不难,难点在于如何避免重复统计 - 碰到某一个岛屿就记一个1,然后把岛屿从地图上抹去
记录一下思路吧,只要碰到1就通过dfs把它附近的1全部抹为0并且count值加1,这里不用dfs使用一个while应该也可以实现
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 判断岛屿数量
# @param grid char字符型二维数组
# @return int整型
#
class Solution:
def dfs(self, grid:List[List[str]], i:int, j:int):
n = len(grid)
m = len(grid[0])
grid[i][j] = '0'
if i - 1 >= 0 and grid[i - 1][j] == '1':
self.dfs(grid, i - 1, j)
if i + 1 < n and grid[i + 1][j] == '1':
self.dfs(grid, i + 1, j)
if j - 1 >= 0 and grid[i][j - 1] == '1':
self.dfs(grid, i, j - 1)
if j + 1 < m and grid[i][j + 1] == '1':
self.dfs(grid, i, j + 1)
def solve(self , grid: List[List[str]]) -> int:
# write code here
# # col and row
n = len(grid)
if n == 0:
return 0
m = len(grid[0])
count = 0
for i in range(n):
for j in range(m):
if grid[i][j] == '1':
count += 1
self.dfs(grid, i, j)
return count
借助队列使用BFS把1改成0,只要碰到1就把那一块相连的1全部改成0,避免在后续碰到的时候发生误判.
from queue import Queue
class Solution:
def solve(self , grid: List[List[str]]) -> int:
n = len(grid)
#空矩阵的情况
if n == 0:
return 0
m = len(grid[0])
#记录岛屿数
count = 0
#遍历矩阵
for i in range(n):
for j in range(m):
if grid[i][j] == '1':
count += 1
grid[i][j] = '0'
q = Queue()
q.put([i, j])
while not q.empty():
temp = q.get()
row = temp[0]
col = temp[1]
#四个方向依次检查:不越界且为1
if row - 1 >= 0 and grid[row - 1][col] == '1':
q.put([row - 1, col])
grid[row - 1][col] = '0'
if row + 1 < n and grid[row + 1][col] == '1':
q.put([row + 1, col])
grid[row + 1][col] = '0'
if col - 1 >= 0 and grid[row][col - 1] == '1':
q.put([row, col - 1])
grid[row][col - 1] = '0'
if col + 1 < m and grid[row][col + 1] == '1':
q.put([row, col + 1])
grid[row][col + 1] = '0'
return count