1. 程式人生 > >【LeetCode 簡單題】108-島嶼的周長

【LeetCode 簡單題】108-島嶼的周長

宣告:

今天是第108道題。給定一個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。網格中的格子水平和垂直方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個包含 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。其實題目的圖已經給了提示了,對於每個黃色小格,如果它上下左右有相鄰的黃色格子的話,重合邊就+1,那麼周長就-1,遍歷每個黃色格子,有相鄰的就-1,程式碼如下。

執行用時: 200 ms, 在Island Perimeter的Python提交中擊敗了82.77% 的使用者

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        cube = 0    # 計算黃色格子的個數
        cut_edge = 0    # 計算需要減去的周長
        m = len(grid[0])    # 橫向,長
        n = len(grid)       # 縱向,寬
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    cube += 1
                    if i-1 >= 0:    # 上
                        cut_edge += grid[i-1][j]
                    if i+1 < n:     # 下,注意這裡i+1不能等於n
                        cut_edge += grid[i+1][j]
                    if j-1 >= 0:    # 左
                        cut_edge += grid[i][j-1]
                    if j+1 < m:     # 右
                        cut_edge += grid[i][j+1]
        return 4*cube - cut_edge

 解法2。進一步簡化邏輯,其實對每個黃色小格子只需計算它的上面和左邊有沒有格子,有的話周長-2,這樣遍歷的時候每條重複的邊都會被計算到,並且不用考慮後面和下面的格子,程式碼如下。

執行用時: 180 ms, 在Island Perimeter的Python提交中擊敗了93.63% 的使用者

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        perimeter = 0
        m = len(grid[0])
        n = len(grid)
        for i in range(n):
            for j in range(m):
                if grid[i][j] == 1:
                    perimeter += 4
                    if i-1 >= 0 and grid[i-1][j] == 1:
                        perimeter -= 2
                    if j-1 >= 0 and grid[i][j-1] == 1:
                        perimeter -= 2
        return perimeter

結尾

解法1:https://blog.csdn.net/weixin_40449300/article/details/80993502

解法2:LeetCode