1. 程式人生 > 其它 >【LeetCode】第463題——島嶼的周長(難度:簡單)

【LeetCode】第463題——島嶼的周長(難度:簡單)

技術標籤:LeetCode題解leetcodejava

【LeetCode】第463題——島嶼的周長(難度:簡單)

題目描述

給定一個 row x col 的二維網格地圖 grid ,其中:grid[i][j] = 1 表示陸地, grid[i][j] = 0 表示水域。

網格中的格子 水平和垂直 方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。

島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。

  1. 示例 1:
    在這裡插入圖片描述
    輸入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
    輸出:16
    解釋:它的周長是上面圖片中的 16 個黃色的邊

  2. 示例 2:
    輸入:grid = [[1]]
    輸出:4

  3. 示例 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; } }

注意點

  • 為什麼只對鄰域進行邊界處理呢?
    因為遍歷是從左上角遍歷到右下角,因此代表著已經遍歷過的區塊,該演算法僅對已遍歷的區塊進行接壤處理,以防止重複計算接壤情況。