给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为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。
并查集解法
// 并查集结构
type ElemStruct struct {
Pre *ElemStruct
Cnt int
}
func findRoot(elem *ElemStruct) *ElemStruct{
if elem.Pre != elem {
return findRoot(elem.Pre)
} else {
return elem
}
}
func unionElem(elem1 *ElemStruct, elem2 *ElemStruct) int {
root1 := findRoot(elem1)
root2 := findRoot(elem2)
if root1 != root2 {
root2.Pre = root1
root1.Cnt += root2.Cnt
}
return root1.Cnt
}
func getMax(v1 int, v2 int) int {
if v1 > v2 {
return v1
}
return v2
}
func getElemVec(rows int, cols int) [][]ElemStruct{
vector := make([][]ElemStruct, 0)
for i:=0; i < rows; i++ {
vector = append(vector, make([]ElemStruct, cols))
}
for i:=range vector{
for j:=range vector[i] {
vector[i][j].Pre = &vector[i][j]
vector[i][j].Cnt = 1
}
}
return vector
}
func maxAreaOfIsland(grid [][]int) int {
rows := len(grid)
max := 0
if rows == 0 {
return max
}
cols := len(grid[0])
vec := getElemVec(rows, cols)
for i:=range grid {
for j:=range grid[i] {
if grid[i][j] == 1 {
tmp := 1
if j+1 < cols && grid[i][j+1] == 1 {
tmp = getMax(unionElem(&vec[i][j], &vec[i][j+1]), tmp)
}
if i+1 < rows && grid[i+1][j] == 1 {
tmp = getMax(unionElem(&vec[i][j], &vec[i+1][j]), tmp)
}
max = getMax(max, tmp)
}
}
}
return max
}