Easy草稿★★★★★O(m * n) 時間 · O(1) 空間
GraphDFSBFSMatrix
Patterns🌊 廣度優先 BFS🕸️ 圖遍歷・連通分量
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

463Island PerimeterGraphsEasyGraphs

給定一個 row x col 的二維網格 grid,其中 1 代表陸地、0 代表水域。網格中恰好有一座島嶼,求該島嶼的周長。

Example:

Input: grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] Output: 16

Intuition

TIP

每個陸地格子最多貢獻 4 條邊,每有一個相鄰陸地就減少一條邊。

Approaches

1. Per-Cell Edge Count — O(m * n) / O(1)
  • Idea: 遍歷每個陸地格子,檢查四個方向,若是邊界或水域則周長加一
  • Time: O(m * n)
  • Space: O(1)
class Solution {
    fun islandPerimeter(grid: Array<IntArray>): Int {
        val m = grid.size
        val n = grid[0].size
        var perimeter = 0
        val dirs = arrayOf(intArrayOf(0, 1), intArrayOf(0, -1), intArrayOf(1, 0), intArrayOf(-1, 0))

        for (i in 0 until m) {
            for (j in 0 until n) {
                if (grid[i][j] == 1) {
                    for ((dr, dc) in dirs) {
                        val nr = i + dr
                        val nc = j + dc
                        if (nr < 0 || nr >= m || nc < 0 || nc >= n || grid[nr][nc] == 0) {
                            perimeter++
                        }
                    }
                }
            }
        }
        return perimeter
    }
}
⭐ 2. Count Land & Adjacencies — O(m * n) / O(1)
  • Idea: 周長 = 4 _ 陸地數 - 2 _ 相鄰對數。只需向右和向下檢查相鄰即可避免重複計算。
  • Time: O(m * n)
  • Space: O(1)
class Solution {
    fun islandPerimeter(grid: Array<IntArray>): Int {
        val m = grid.size
        val n = grid[0].size
        var cells = 0
        var neighbors = 0

        for (i in 0 until m) {
            for (j in 0 until n) {
                if (grid[i][j] == 1) {
                    cells++
                    if (i + 1 < m && grid[i + 1][j] == 1) neighbors++
                    if (j + 1 < n && grid[i][j + 1] == 1) neighbors++
                }
            }
        }
        return 4 * cells - 2 * neighbors
    }
}

🔑 Takeaways