求水中岛周长问题

问题描述:给出一个二维整数网格形式的地图,其中1表示土地,0表示水。 网格单元水平/垂直(不对角线)连接。 网格完全被水包围,并且正好有一个岛(即,一个或多个连接的地面细胞)。 岛上没有“湖泊”(水内没有连接到岛上的水)。 一个单元格是具有边长为1的正方形。网格为矩形,宽度和高度不超过100,确定岛的周长。

[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

Answer: 16
Explanation: The perimeter is the 16 yellow stripes in the image below:
解析思路:看到此题时,首先想到的思路是从整体有多少行,多少列,再去考虑小方块之间有几个有粘连情况,但是在解决粘连这部分时仍需要去遍历,这反而使得问题变得复杂;从另一种思路去考虑,去考虑每个个体的边的情况,那么每个方块的露在外边的边长为4减去这个方块连接的方块的个数,然后对每个方块进行遍历,进而得到总周长。

代码部分:

/**
 * @param {number[][]} grid
 * @return {number}
 */
var islandPerimeter = function(grid) {

    var sum = 0;
    for(var i=0; i<grid.length; i++){
        for(var j=0; j<grid[i].length; j++){
            if(grid[i][j] == 1){
                var left = j-1 < 0 ? 0 :grid[i][j-1];
                var right = j+1 >= grid[i].length ? 0 : grid[i][j+1];
                var top = i-1 < 0 ? 0 : grid[i-1][j];
                var bottom = i+1 >= grid.length ? 0 : grid[i+1][j];
                var num = 4 - (left + right + top + bottom);
                sum = sum + num;
                
            }
        }
    }
    return sum;
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值