leetcode hot100 200. 岛屿数量 medium dfs


  1. 遍历网格里面的每一个点
  2. 对这每一个点去左右上下四个方向走,也就是:(i,j−1),(i,j+1),(i−1,j),(i+1,j)
  3. 发现是陆地,gridij 改成 2 (标记找到)
  4. 如果 (i,j) 出界,或者 (i,j) 是水,或者 (i,j) 已发现(gridij == 2),就不再继续往下递归。

即:

二叉树 网格图
递归入口 根节点 岛屿第一行最左边的陆地
递归方向 左节点和右节点 左右上下的相邻陆地
递归边界 空节点(或者叶节点) 出界、遇到水或者已标记

不能在 dfs 内部 self.cnt += 1,这样最后统计出来的不是"岛屿的数量",而是所有陆地格子的总面积

python 复制代码
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        
        if not grid:
            return 0

        m = len(grid)
        n = len(grid[0])

        # 递归函数dfs用于判别当前节点是不是陆地,并递归左右上下,不需要返回
        def dfs(i,j):
            
            # 停止搜索条件:出界、不是陆地
            if i>=m or i<0 or j<0 or j>=n or grid[i][j] != '1':
                return  # 停止搜索

            # 则 grid[i][j] == '1' 陆地,标记改陆地已搜索
            grid[i][j] = '2'

            # 递归 左右上下
            dfs(i, j-1)
            dfs(i, j+1)
            dfs(i-1, j)
            dfs(i+1, j)

        count = 0
        # 遍历每一个格子
        for row in range(m):
            for col in range(n):
                if grid[row][col] == '1':
                    # 发现新岛屿!
                    count += 1   
                    # 派 DFS 去把这座岛所有相连的陆地都标记了
                    dfs(row, col)   # 只在发现陆地时,去搜索当前陆地周围

        return count

时间复杂度:O(M×N)O(M \times N)O(M×N)

其中 MMM 是行数,NNN 是列数。

遍历过程:需要使用双重循环遍历整个网格的每一个格子,这部分是 O(M×N)O(M \times N)O(M×N)。DFS 过程:虽然每个 '1' 都会触发 DFS,注意:每个格子最多只会被访问两次(一次是在双重循环扫描时,另一次是在 DFS 感染时被标记为 '0')。一旦格子被标记为 '0',它就再也不会进入 DFS 的逻辑。

空间复杂度:O(M×N)O(M \times N)O(M×N)

空间开销主要来自递归调用的系统栈高度。最坏情况:如果整个网格全是陆地(全为 '1'),DFS 会从一个点开始感染。在递归过程中,由于是深度优先,系统栈的深度可能会达到整个网格的大小。

相关推荐
To_OC7 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎8 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC9 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
tachibana219 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
晚笙coding21 小时前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
兰令水1 天前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
退休倒计时1 天前
【每日一题】LeetCode 131. 分割回文串 TypeScript
算法·leetcode·typescript
旖-旎2 天前
LeetCode 279:完全平方数(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
良木林2 天前
滑动窗口 - LeetCode hot 100
javascript·算法·leetcode·双指针·滑动窗口
晚笙coding2 天前
LeetCode 108:将有序数组转换为二叉搜索树 —— 从数组到平衡二叉树的递归构造
数据结构·算法·leetcode