1. 程式人生 > >Leetcode:463.島嶼的周長

Leetcode:463.島嶼的周長

給定一個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。

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

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

 

示例 :

輸入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

輸出: 16

解釋: 它的周長是下面圖片中的 16 個黃色的邊:

在真實的面試中遇到過這道題?

解題思路:

模擬題。理論上出現1的位置會貢獻4的周長,但是周圍的鄰居如果是1會減小貢獻值。

  1. 找到數值為1的點。
  2. 計算它上下左右(如果有)中1的個數num
  3. 當前點對周長的貢獻則是4-num。
  4. 統計所有點的貢獻值即可。

C++程式碼

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        int sizex = grid.size();
        if (sizex == 0) return 0;
        int sizey = grid[0].size();
        if (sizey == 0) return 0;
        int res = 0;
        for (int i = 1; i <= sizex; i++) {
            for (int j = 1; j <= sizey; j++) {
                if (grid[i - 1][j - 1] == 1) {
                    res += 4;
                    if (i > 1 && grid[i - 2][j - 1] == 1) res--;
                    if (i < sizex&&grid[i][j - 1] == 1) res--;
                    if (j > 1 && grid[i - 1][j - 2] == 1) res--;
                    if (j < sizey&&grid[i - 1][j] == 1) res--;
                }
            }
        }
        return res;
    }
};

//下面關掉沒有用的介面

static const auto _____ = []()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();