給定一個包含了一些 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
}
學到了
- 遞迴函式
- DFS
本作品採用《CC 協議》,轉載必須註明作者和本文連結