我用演算法學golang(島嶼的最大面積)

undefined_fx發表於2021-08-30

給定一個包含了一些 0 和 1 的非空二維陣列 grid 。

一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裡的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。你可以假設 grid 的四個邊緣都被 0(代表水)包圍著。

找到給定的二維陣列中最大的島嶼面積。(如果沒有島嶼,則返回面積為 0 。)

示例 1:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]

對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因為島嶼只能包含水平或垂直的四個方向的 1 。

示例 2:


[[0,0,0,0,0,0,0,0]]

對於上面這個給定的矩陣, 返回 0。

注意: 給定的矩陣grid 的長度和寬度都不超過 50。

解題思路

首先需要讀懂題意 可以想象成一個棋盤 將0看為水 將1 看為陸地 上下左右 相鄰得越多 即島嶼面積越大

直接將二維陣列遍歷 發現存在等於1 時 做一個遞迴尋找 即查詢上下左右得是否為1

答案

func maxAreaOfIsland(grid [][]int) int {
    res :=0
    for i,v1 := range grid{
        for j,v2 := range v1{
            if v2 == 1{
                num := depthSearch(&grid,i,j)
                if num > res {
                    res = num
                }
            }
        }
    }

return res 
}

// 傳入引數為指標 指向這個二維陣列得指標 使得值不需要重複
func depthSearch(grid *[][]int,  i int, j int ) int{
    if i>=0 && i< len(*grid) && j >= 0 && j < len((*grid)[i]) && (*grid)[i][j] == 1{
        (*grid)[i][j] = 0 // 注意此出遞迴時 需要將自己賦值為0  
        num := 1 + depthSearch(grid,i-1,j) + depthSearch(grid,i+1,j) + depthSearch(grid,i,j+1) + depthSearch(grid,i,j-1)

        return num
        }
    return 0
}

學到了

  1. 遞迴函式
  2. DFS
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章