天天看點

[leetcode]島嶼的周長[javascript]

https://leetcode-cn.com/problems/island-perimeter/

描述

給定一個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。

網格中的格子水準和垂直方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。

島嶼中沒有“湖”(“湖” 指水域在島嶼内部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形。網格為長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。

示例 :

輸入:
[[0,1,0,0],
 [1,1,1,0],
 [0,1,0,0],
 [1,1,0,0]]

輸出: 16
           

解釋: 它的周長是下面圖檔中的 16 個黃色的邊:

[leetcode]島嶼的周長[javascript]

分析

由圖可知,島嶼的周長 = 陸地的個數 * 4 - 交界的個數 * 2。

于是可以暴力循環求解

var islandPerimeter = function(grid) {
  let cross = 0, count = 0
  grid.forEach((item, index) => {
    item.forEach((i, key) => {
      if (i === 1) {
        let up = index - 1, left = key - 1
        if (up >= 0 && grid[up][key] === 1) {
          cross++
        }
        if (left >= 0 && grid[index][left] === 1) {
          cross++
        }
        count++
      }
    })
  })
  return count * 4 - cross * 2
};
           

上面算交界時隻判斷了上和左,因為下和右再判斷的話其實是重複了,沒必要判斷。