【LeetCode】第463題——島嶼的周長(難度:簡單)
阿新 • • 發佈:2021-02-01
【LeetCode】第463題——島嶼的周長(難度:簡單)
題目描述
給定一個 row x col 的二維網格地圖 grid ,其中:grid[i][j] = 1 表示陸地, grid[i][j] = 0 表示水域。
網格中的格子 水平和垂直 方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。
島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。
-
示例 1:
輸入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
輸出:16
解釋:它的周長是上面圖片中的 16 個黃色的邊 -
示例 2:
輸入:grid = [[1]]
輸出:4 -
示例 3:
輸入:grid = [[1,0]]
輸出:4
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 100
grid[i][j] 為 0 或 1
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/island-perimeter
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解題思路
每遍歷到島嶼(即1)時邊長長度+4,然後在看看當前島嶼的上邊和左邊(排除邊界)是否有島嶼塊接壤,若有一塊便-2。
程式碼詳解
class Solution {
public int islandPerimeter(int[][] grid) {
int round = 0; // 記錄周長
for(int i = 0; i < grid.length; ++i) { // 行
for(int j = 0; j < grid[0].length; ++j) { // 列,grid[i]也可
if( grid[i][j] == 1) { // 遍歷到一塊島嶼便讓周長+4
round += 4;
if(i - 1 >= 0 && grid[i-1][j] == 1) { // 非邊界的上鄰域如果也是島嶼塊則邊長-2
round -= 2;
}
if(j - 1 >= 0 && grid[i][j-1] == 1) { // 非邊界的左鄰域如果也是島嶼塊則邊長-2
round -= 2;
}
}
}
}
return round;
}
}
注意點
- 為什麼只對左和上鄰域進行邊界處理呢?
因為遍歷是從左上角遍歷到右下角,因此左與上代表著已經遍歷過的區塊,該演算法僅對已遍歷的區塊進行接壤處理,以防止重複計算接壤情況。