岛屿数量

本文介绍了一种使用广度优先搜索(BFS)和深度优先搜索(DFS)算法来计算二维网格中岛屿数量的方法。通过遍历网格,每当遇到岛屿时,使用BFS或DFS进行搜索并将已访问的部分标记为已处理,以此来准确计算岛屿的总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BFS方法,每次发现为‘1’的岛屿才搜索,且只要搜到连通域就将其置‘0’:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:

        len_i = len(grid)
        if len_i == 0:
            return 0
        len_j = len(grid[0])

        numLands = 0

        from collections import deque

        for m in range(len_i): #以这种方式对每个位置搜索
            for n in range(len_j):
                if grid[m][n] == '1':
                    numLands += 1
                    stack = deque([[m, n]])
                    grid[m][n] = '0'
                    while stack:
                        i, j = stack.popleft()
                        if i + 1 < len_i and grid[i + 1][j] == '1':
                            stack.append([i + 1, j])
                            grid[i + 1][j] = '0' #搜索到就置0

                        if i - 1 >= 0 and grid[i - 1][j] == '1':
                            stack.append([i - 1, j])
                            grid[i - 1][j] = '0'

                        if j + 1 < len_j and grid[i][j + 1] == '1':
                            stack.append([i, j + 1])
                            grid[i][j + 1] = '0'

                        if j - 1 >= 0 and grid[i][j - 1] == '1':
                            stack.append([i, j - 1])
                            grid[i][j - 1] = '0'
        return numLands

dfs解法:

from collections import deque

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        
        def __dfs(grid, len_i, len_j, pos):
            i, j = pos[0], pos[1]
            directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
            for di, dj in directions:
                if 0 <= (i + di) < len_i and 0 <= (j + dj) < len_j and grid[i + di][j + dj] == '1':
                    grid[i + di][j + dj] = '0'
                    __dfs(grid, len_i, len_j, [i + di, j + dj])

        len_i = len(grid)
        if len_i == 0:
            return 0
        len_j = len(grid[0])

        numLands = 0

        for m in range(len_i):
            for n in range(len_j):
                if grid[m][n] == '1':
                    numLands += 1
                    grid[m][n] = '0'
                    __dfs(grid, len_i, len_j, (m, n))
                    
        return numLands

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值