題目描述:給定一個 n×n 的方格,grid[r][c] 代表該格子的海拔高度。水位在時間 t 時為 t。你從左上角 (0,0) 出發,目標是抵達右下角 (n-1,n-1)。你只能在相鄰格子(上下左右)之間移動,且只有在兩格的海拔都 ≤ 當前水位時才能通過。請問最少需要等待多久(最小的 t)才能到達終點?
解題思路:本題可用 Dijkstra 最短路徑來解,其中「距離」定義為「抵達某格所需的最小水位」。
核心觀察:從起點走到某個格子的代價,是沿途所有格子高度的最大值(因為水位要夠高才能淹過每一格)。因此這是一個「最小化最大值」的路徑問題,非常適合用最小堆(min-heap)來實作 Dijkstra。
演算法步驟:
(grid[0][0], 0, 0),代表抵達 (0,0) 的代價為其高度。(cost, r, c)。(n-1, n-1),直接回傳 cost。max(cost, grid[nr][nc]),若比已知更小則推入堆。此方法保證每次處理的都是目前可達的最小水位路徑,時間複雜度 O(n² log n)。
時間複雜度:O(n² log n) — 方格共有 n² 個節點,每個節點最多入堆一次,堆的操作為 O(log n²) = O(log n),整體為 O(n² log n)。
空間複雜度:O(n²) — visited 陣列與優先佇列各需 O(n²) 空間。
1. Initialize min-heap with (grid[0][0], 0, 0) and a visited matrix.
2. While heap is not empty:
a. Pop (cost, r, c) — the cell reachable at minimum water level.
b. If (r, c) == (n-1, n-1), return cost.
c. If already visited, skip.
d. Mark (r, c) as visited.
e. For each neighbor (nr, nc):
- newCost = max(cost, grid[nr][nc])
- If not visited, push (newCost, nr, nc) onto heap.
3. Return -1 (should not reach here for valid input).Binary Search + BFS/DFS O(n² log n):對答案 t 做二分搜尋(範圍 0 到 n²-1),每次用 BFS/DFS 檢查「只走高度 ≤ t 的格子能否從 (0,0) 到 (n-1,n-1)」。二分搜尋 O(log n²) 輪,每輪 BFS O(n²),總複雜度同為 O(n² log n)。實作較直觀,但常數略大。
Union-Find O(n² α(n²)):將所有格子按高度排序,逐一加入並與相鄰格子合併。每加入一個格子後,檢查起點與終點是否連通。達到連通時的當前高度即為答案。幾乎線性時間,但實作較複雜。