返回

算法通关指南:LeetCode 695. 岛屿的最大面积

闲谈

算法通关指南:LeetCode 695. 岛屿的最大面积

在算法学习的道路上,算法通关指南就像一盏明灯,指引着我们深入算法世界的奥秘。今天,我们将共同开启 LeetCode 695. 岛屿的最大面积 的解题之旅,探索两种经典算法的精妙之处:深度优先搜索 (DFS) 和广度优先搜索 (BFS)。

问题概述

给定一个包含 0 和 1 的二维网格,其中 1 代表陆地,0 代表水域。相邻的 1 构成一个岛屿。你的任务是找到网格中面积最大的岛屿并返回其面积。

解法一:深度优先搜索 (DFS)

深度优先搜索就像一个探险家,深入未知的领域,逐个探索相邻的单元格。它的基本思想是:

  • 从一个未访问的陆地单元格出发,标记它为已访问。
  • 递归地探索其四个相邻单元格(左、上、右、下)。
  • 统计当前探索的陆地单元格数量,作为该岛屿的面积。
  • 返回该岛屿的面积,并更新最大岛屿面积。

代码示例:

def maxAreaOfIsland(grid):
    max_area = 0  # 最大岛屿面积
    visited = [[False] * len(grid[0]) for _ in range(len(grid))]  # 访问标记

    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == 1 and not visited[i][j]:
                max_area = max(max_area, dfs(grid, visited, i, j))
    return max_area

def dfs(grid, visited, i, j):
    if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0 or visited[i][j]:
        return 0
    
    visited[i][j] = True  # 标记当前单元格已访问
    return 1 + dfs(grid, visited, i-1, j) + dfs(grid, visited, i+1, j) + dfs(grid, visited, i, j-1) + dfs(grid, visited, i, j+1)

解法二:广度优先搜索 (BFS)

广度优先搜索更像是一场蔓延的火势,从一个陆地单元格出发,逐步向四周扩散。它的基本思想是:

  • 从一个未访问的陆地单元格出发,将其加入队列。
  • 循环遍历队列,依次取出每个单元格,并将其标记为已访问。
  • 探索其四个相邻单元格,如果相邻单元格为陆地且未访问,则将其加入队列。
  • 统计当前 BFS 遍历的所有陆地单元格数量,作为该岛屿的面积。
  • 返回该岛屿的面积,并更新最大岛屿面积。

代码示例:

def maxAreaOfIsland(grid):
    max_area = 0  # 最大岛屿面积
    visited = [[False] * len(grid[0]) for _ in range(len(grid))]  # 访问标记
    queue = []  # 队列

    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == 1 and not visited[i][j]:
                queue.append((i, j))
                visited[i][j] = True
                island_area = 0  # 当前岛屿面积
                while queue:
                    x, y = queue.pop(0)
                    island_area += 1
                    for dx, dy in [(0, 1), (0, -1), (-1, 0), (1, 0)]:  # 四个方向
                        nx, ny = x + dx, y + dy
                        if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 1 and not visited[nx][ny]:
                            queue.append((nx, ny))
                            visited[nx][ny] = True
                max_area = max(max_area, island_area)
    return max_area

总结

DFS 和 BFS 都是解决「岛屿的最大面积」问题的经典算法,各有优缺点。DFS 递归深度探索,适用于树状或图状结构,而 BFS 层次遍历,适用于较浅的结构。在实际场景中,根据具体问题选择合适的算法至关重要。

常见问题解答

  1. DFS 和 BFS 的时间复杂度是多少?

    • DFS:O(mn),其中 m 和 n 是网格的大小。
    • BFS:O(mn),其中 m 和 n 是网格的大小。
  2. 为什么在 DFS 中需要访问标记?

    • 访问标记防止我们重复访问同一单元格,从而避免无限循环。
  3. 为什么在 BFS 中需要队列?

    • 队列存储待探索的单元格,确保按顺序进行广度遍历。
  4. 如何处理网格中的多个岛屿?

    • 在 DFS 或 BFS 中,只要遇到未访问的陆地单元格,就表示发现了新的岛屿,需要重新统计其面积。
  5. 这两种算法是否可以扩展到三维网格?

    • 是的,DFS 和 BFS 可以扩展到三维网格,只需考虑三个方向即可:上、下、左、右、前、后。

结语

算法通关指南系列旨在为你提供清晰简洁的算法讲解,助你轻松掌握算法精髓。希望本篇指南能为你打开 LeetCode 695. 岛屿的最大面积 的大门,让你在算法探索之旅中不断突破自我!