小G的算法刷题日记 - 岛屿问题

最近面试经常被考到岛屿问题,于是简单整理了几道岛屿相关的问题供大家参考。

200. 岛屿问题

题目重点:给你一个二维网格 grid,里面每个格子是 '1': 陆地, '0': 水域,目标:计算一共有多少快不连通的陆地块即岛屿。

思路:DFS搜索所有的岛屿,遍历整个 gird,每遇到一个'1'就说明找到了一个新的岛屿,然后从这个点出发,用DFS把这个岛屿上所有的'1'都标记为‘0’,表示已访问过。

核心代码:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid or not grid[0]:
            return 0

        rows, cols = len(grid), len(grid[0])
        res = 0

        def dfs(r, c):
            # 越界或遇到水,停止递归
            if r < 0 or r >= rows or c < 0 or c >= cols or grid[r][c] == '0':
                return
            grid[r][c] = '0'  # 标记已访问
            # 四个方向继续搜索
            dfs(r+1, c)
            dfs(r-1, c)
            dfs(r, c+1)
            dfs(r, c-1)

        for r in range(rows):
            for c in range(cols):
                if grid[r][c] == '1':
                    res += 1
                    dfs(r, c)  # 从这个'1'开始清除整块岛屿

        return res

695. 岛屿的最大面积

题目重点:给你一个二维网格 grid,里面每个格子是 1: 陆地, 0: 水域,目标:返回所有岛屿中,面积最大的那一个岛屿的面积(即最多有多少个相连的1)

思路:从每个为1的点出发,做DFS把整个岛屿搜索一遍,并统计该岛屿面积;每次找到新的1,就启动一次DFS,返回该岛屿的面积,更新最大值。

核心代码:

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        rows, cols = len(grid), len(grid[0])
        max_area = 0

        def dfs(r, c):
            if r < 0 or r >= rows or c < 0 or c >= cols or grid[r][c] == 0:
                return 0
            grid[r][c] = 0  # 标记为已访问
            area = 1  # 当前格子
            # 四个方向探索
            area += dfs(r+1, c)
            area += dfs(r-1, c)
            area += dfs(r, c+1)
            area += dfs(r, c-1)
            return area

        for r in range(rows):
            for c in range(cols):
                if grid[r][c] == 1:
                    max_area = max(max_area, dfs(r, c))

        return max_area

200. 岛屿问题 vs. 695. 岛屿的最大面积

岛屿问题核心:每发现一块新的岛屿就计数 +1,不关心每块的面积有多大。

岛屿的最大面积核心:每次DFS不计数,而是累计这块岛屿的大小,再找最大值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值