增加建造最大岛屿代码go语言版本

This commit is contained in:
lylain
2025-03-22 13:58:11 +08:00
parent 6d50f4735a
commit 1ff8e636f8

View File

@@ -528,6 +528,104 @@ if __name__ == "__main__":
### Go
```go
package main
import "fmt"
func main() {
var m, n int
fmt.Scan(&m, &n)
grid := make([][]int, m)
for i := range grid {
grid[i] = make([]int, n)
for j := range grid[i] {
fmt.Scan(&grid[i][j])
}
}
sum := buildMaxIsland(grid)
fmt.Println(sum)
}
func buildMaxIsland(grid [][]int) int {
result := 0
if grid == nil || len(grid) == 0 {
return result
}
hashMap := make(map[int]int)
islandArea := 0
gridMark := 2
for i := 0; i < len(grid); i++ {
for j := 0; j < len(grid[0]); j++ {
if grid[i][j] == 1 {
islandArea = 0
visitGrid4(grid, i, j, &islandArea, gridMark)
hashMap[gridMark] = islandArea
if islandArea > result {
result = islandArea
}
gridMark++
}
}
}
for i := 0; i < len(grid); i++ {
for j := 0; j < len(grid[0]); j++ {
if grid[i][j] == 0 {
sum := findNearByIsland(grid, i, j, hashMap)
if sum > result {
result = sum
}
}
}
}
return result
}
func visitGrid4(grid [][]int, x int, y int, preValue *int, gridMark int) {
if x < 0 || y < 0 || x >= len(grid) || y >= len(grid[0]) {
return
}
//可以省略掉visited的原因是因为grid的每个位置如果被遍历过就会被标记为gridMark能识别出来是不是被遍历过
if grid[x][y] != 1 {
return
}
// visited[x][y] = true
grid[x][y] = gridMark
*preValue++
visitGrid4(grid, x+1, y, preValue, gridMark)
visitGrid4(grid, x-1, y, preValue, gridMark)
visitGrid4(grid, x, y+1, preValue, gridMark)
visitGrid4(grid, x, y-1, preValue, gridMark)
}
func findNearByIsland(grid [][]int, x, y int, hashMap map[int]int) int {
markSet := make(map[int]bool)
sum := 1
coordinate := [][]int{{x + 1, y}, {x - 1, y}, {x, y + 1}, {x, y - 1}}
for _, arr := range coordinate {
if arr[0] < 0 || arr[1] < 0 || arr[0] >= len(grid) || arr[1] >= len(grid[0]) {
continue
}
if grid[arr[0]][arr[1]] == 0 {
continue
}
gridMark := grid[arr[0]][arr[1]]
if !markSet[gridMark] {
markSet[gridMark] = true
sum += hashMap[gridMark]
}
}
return sum
}
```
### Rust
### JavaScript