您的位置 首页 golang

Leetcode-岛屿的周长代码示例(Golang)

题目描述

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。

网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 :

 输入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]
输出: 16
解释: 它的周长是下面图片中的 16 个黄色的边:  

岛屿的周长示意图

解题思路

虽然耗时长,内存消耗大,但是是最容易想到的一种方式,遍历切片,如果当前位置是岛屿,总算加4,检查上下左右,如果有相邻岛屿,则总数 -1.

也可以简化为只检查右侧和下面,如果右边是岛屿,-2,如果下面是岛屿,-2,这样只用判断两个方向,而不需要判断四个方向了

代码示例

直接遍历,如果当前值为1,加4(四条边),如果左边有1,减2(两条边重合),上面有1,减2。 最后相加即可

 func islandPerimeter(grid [][]int) int {
    r, c := len(grid), len(grid[0])
    sum := 0
    for i, row := range grid {
        for j, v := range row {
            if v == 1 {
                sum += 4
                //下方同一列为陆地
                if i + 1 < r && grid[i + 1][j] == 1 {
                    sum -= 2
                }
                //右侧相邻位置为陆地
                if j + 1 < c && grid[i][j + 1] == 1 {
                    sum -= 2
                }
            }
        }
    }
    return sum
}  

文章来源:智云一二三科技

文章标题:Leetcode-岛屿的周长代码示例(Golang)

文章地址:https://www.zhihuclub.com/98011.shtml

关于作者: 智云科技

热门文章

网站地图