↓快轉到主要內容
  1. LeetCode/

LeetCode 695: Max Area of Island

·1 分鐘· ·
LeetCode Medium Array Depth-First-Search Breadth-First-Search Union-Find
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-30

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

連通塊(BFS 模板二):掃過每一格,遇到 1 就從它開始 DFS,把走過的格子改成 0(原地標記),數這座島有幾格,取最大值。這題的格子是整數 0、1,跟 LC 200 的字串 "1" 不一樣。

我的嘗試
#

第一版從 LC 200 改過來,比較的還是字串 '1',但這題的格子是整數,永遠不相等:[[1]] 回傳 0。改成 1 就 AC 了。

正確解法
#

class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        def dfs(i, j):
            if i < 0 or j < 0 or i >= m or j >= n or grid[i][j] != 1:
                return 0
            grid[i][j] = 0
            return 1 + dfs(i + 1, j) + dfs(i - 1, j) + dfs(i, j + 1) + dfs(i, j - 1)
        return max((dfs(i, j) for i in range(m) for j in range(n)), default=0)

複雜度
#

時間 O(mn),空間 O(mn)(遞迴深度)。

要特別避免的錯誤
#

  • 格子是整數,不要跟 '1' 比。

面試口說整理
#

我掃過每一格,遇到 1 就 DFS 整座島,把走過的格子改成 0 並數格子數,取最大值。每格只走一次,時間 O(mn)。

相關文章

LeetCode 417: Pacific Atlantic Water Flow
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Matrix
LeetCode 417 解題筆記:反過來從海邊往內走,只能走到不比自己低的格子;兩個海都走得到的格子就是答案
LeetCode 133: Clone Graph
·1 分鐘
LeetCode Medium Hash-Table Depth-First-Search Breadth-First-Search Graph
LeetCode 133 解題筆記:DFS 時用雜湊表記住舊節點對應的新節點,遇到已經複製過的就直接回傳,避免無限遞迴;空圖回傳 None
LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點
LeetCode 199: Binary Tree Right Side View
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 199 解題筆記:層序遍歷,每一層最右邊的節點就是從右邊看得到的
LeetCode 128: Longest Consecutive Sequence
·1 分鐘
LeetCode Medium Array Hash-Table Union-Find
LeetCode 128 解題筆記:放進 set,只從「x - 1 不在 set 裡」的數開始往上數,每個數最多被看兩次,O(n)
LeetCode 79: Word Search
·2 分鐘
LeetCode Medium Array String Backtracking Depth-First-Search
LeetCode 79 解題筆記:從每一格開始回溯,往四個方向比對下一個字元,走過的格子暫時標記,回溯時還原;先用字元次數剪枝