解題說明
Island Perimeter
題目描述:
給定一個二維網格 grid,其中 1 代表陸地、0 代表水域。網格中恰好只有一座島嶼(所有陸地格子相連),且島嶼內沒有湖泊。計算島嶼的周長。
解題思路: 直接計數法。遍歷每個陸地格子,每個陸地格子最多貢獻 4 條邊,但每當它與相鄰的陸地格子相鄰時,共用的邊不計入周長。
具體做法:
- 遍歷每個格子,若為陸地則初始貢獻 4。
- 檢查右邊和下邊是否也是陸地(只需檢查兩個方向避免重複計算):
- 若右邊是陸地,周長減 2(兩格各少一條邊)。
- 若下邊是陸地,周長減 2。
這樣每條共用邊恰好被扣除一次(從兩個方向各扣 1)。
C++ 解法
複雜度分析
時間複雜度:O(m * n) — 遍歷整個 m x n 網格一次。
空間複雜度:O(1) — 只使用常數額外空間。
虛擬碼
1. Initialize perimeter = 0
2. For each cell (i, j) in grid:
a. If grid[i][j] == 1 (land):
- perimeter += 4
- If right neighbor is land: perimeter -= 2
- If bottom neighbor is land: perimeter -= 2
3. Return perimeter其他解法
四方向檢查法:對每個陸地格子檢查四個方向(上下左右),若相鄰格子是水域或超出邊界,則該邊計入周長。時間 O(m*n),空間 O(1)。邏輯上更直觀——每條邊界邊直接被計入,不需要「先加後減」的思維。
DFS/BFS 遍歷:從任一陸地格子開始 DFS/BFS,遇到水域或邊界時計數。時間 O(mn),空間 O(mn)(遞迴堆疊或佇列)。對此題來說過度複雜,但在需要區分多個島嶼時更實用。
延伸思考
- 若網格中有多個島嶼,如何分別計算每個島嶼的周長?
- 島嶼面積與周長有什麼數學關係?是否可以根據面積推導出最小/最大周長?
- 若島嶼內部可能有湖泊(被陸地完全包圍的水域),湖泊的邊是否算入島嶼周長?如何修改算法?