[更文刷题] 463. 岛屿的周长

110 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

一、题目描述:

463. 岛屿的周长

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

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

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

 

示例 1:

image.png

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

示例 2:

输入:grid = [[1]]
输出:4

示例 3:

输入:grid = [[1,0]]
输出:4

提示:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 100
  • grid[i][j] 为 0 或 1

二、思路分析:

1.只要有是1,周长加4 2. 有重叠的部分 考虑什么情况重叠:
上下重叠,和左右重叠

为了好计算,我定义了,左重叠,和上重叠,
碰到一就加4
碰到重叠就减2,因为重叠 是两个边,所以减2
第一列是没有左重叠的.
第一行没有上重叠.

三、AC 代码:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var islandPerimeter = function(grid) {
    var count = 0
    // i是行
    for(let i = 0 ; i < grid.length; i++){
        // 就是列
        let element = grid[i]
        for(let j = 0 ; j < element.length; j++){
            if(grid[i][j] == 1){
                count += 4
                if(j != 0 ){
                    if(grid[i][j-1] == 1){
                        count -= 2
                    }
                }
                if(i != 0){
                    if(grid[i-1][j] == 1){
                        count -= 2
                    }
                }
            }
            
        }
    }
    return count 
};

四、参考:

463. 广度优先搜索入队标记和出队标记对比 C++ 代码 - 岛屿的周长 - 力扣(LeetCode)

「ITCharge」463. 岛屿的周长「广度优先搜索」 - 岛屿的周长 - 力扣(LeetCode)