Go语言解LeetCode 463:岛屿周长详解与实现
本文详细讲解如何使用Go语言解决LeetCode第463题“岛屿周长”。针对由0(水)和1(陆地)组成的二维网格,我们遍历每个单元格,根据其与相邻单元格的连接情况累加周长,最终输出准确的岛屿边缘长度。
题目描述
给定一个 row x col 的二维网格地图 grid,其中:
grid[i][j] = 1表示陆地;grid[i][j] = 0表示水域。
格子在水平和垂直方向相连(对角线不相连),整个网格被水完全包围,且恰好有一个岛屿(或多个相连的陆地组成)。岛屿内部没有“湖”。我们需要计算这个岛屿的周长。
示例 1:

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是图中显示的黄边数量。
其他示例包括:
- 输入:
[[1]],输出:4 - 输入:
[[1,0]],输出:4
思路分析
计算周长的核心在于确定陆地单元格暴露在水域或边界上的边数。对于任意一个值为 1 的陆地单元格,它有四条边。如果某条边的邻居也是陆地(值为 1),则这条边不计入周长;如果邻居是水域(值为 0)或者处于网格外部(边界),则计入周长。
我们可以采用直接遍历法:
- 初始化周长计数器为 0。
- 遍历网格中的每一个单元格。
- 当发现单元格为陆地(值为 1)时,检查其上、下、左、右四个方向的邻居。
- 若某个方向的邻居越界或者是水域(值为 0),则将周长计数器加 1。
Go 语言 AC 代码
以下是标准的 Go 语言实现,包含必要的错误处理和边界检查。
package main
func islandPerimeter(grid [][]int) int {
rows := len(grid)
if rows == 0 {
return 0
}
cols := len(grid[0])
perimeter := 0
for i := 0; i < rows; i++ {
for j := 0; j < cols; j++ {
// 只有当当前格子是陆地时才进行周长计算
if grid[i][j] == 1 {
// 向上判断
if i == 0 || grid[i-1][j] == 0 {
perimeter++
}
// 向下判断
if i == rows-1 || grid[i+1][j] == 0 {
perimeter++
}
// 向左判断
if j == 0 || grid[i][j-1] == 0 {
perimeter++
}
// 向右判断
if j == cols-1 || grid[i][j+1] == 0 {
perimeter++
}
}
}
}
return perimeter
}
这段代码通过条件判断巧妙地结合了“索引越界”与“值为0”两种情况,统一处理了边界和内部的周长累加逻辑,保证了算法的高效性与准确性。
以上就是Go语言解LeetCode 463岛屿周长的详细内容,更多关于Go算法题解的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









