【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