---
# System prepended metadata

title: \#463 Island Perimeter
tags: [application problem, leetcode, leetcode-easy]

---

# \#463 Island Perimeter
## *給定一個二維陣列grid表示一座陸地和海水, 陣列元素1=陸地, 0=海水, 回傳該陣列的陸地周長(已知沒有湖泊)*
## Log
 - build 20210903 by syhuang

## 優化
 - 當遇到陸地時, 周長+4
 - 檢查右方和下方, 如果也是陸地就-2(因迴圈按順序往右往下, 只需檢查右和下的元素)
 - leetcode submit runtime 32%, memory 22%
```javascript=
var islandPerimeter = function(grid) {
    let result = 0;
    for(let row=0; row<grid.length; row++){
        for(let col=0; col<grid[0].length; col++){
            if(grid[row][col]==0) continue;
            result += 4;
            //右
            if(row<grid.length-1 && grid[row+1][col]==1) result-=2;
            //下
            if(col<grid[0].length-1 && grid[row][col+1]==1) result-=2;
        }
    }
    return result;
};
```
## 初見
 - 檢查陣列中的每個元素, 當其為陸地(=1)時, 檢查上下左右的元素, 是水的時候周長+1
 - leetcode submit runtime 5%, memory 5%
```javascript=
var islandPerimeter = function(grid) {
    //檢查每塊陸地的上下左右,只要是水區塊或是邊界,面積+1
    let result = 0;
    for(let row=0; row<grid.length; row++){
        for(let col=0; col<grid[row].length; col++){
            if(grid[row][col]==0) continue;
            //上
            if(typeof(grid[row-1])=='undefined') result++;
            else if(grid[row-1][col]==0) result++;
            //下
            if(typeof(grid[row+1])=='undefined') result++;
            else if(grid[row+1][col]==0) result++;
            //左
            if(typeof(grid[row][col-1])=='undefined') result++;
            else if(grid[row][col-1]==0) result++;
            //右
            if(typeof(grid[row][col+1])=='undefined') result++;
            else if(grid[row][col+1]==0) result++;
        }
    }
    return result;
};
```
## 備註
## 參考
- [參考解](https://leetcode.com/problems/island-perimeter/discuss/94992/Java-9-line-solution-add-4-for-each-land-and-remove-2-for-each-internal-edge)
- [另一種](https://leetcode.com/problems/island-perimeter/discuss/95001/clear-and-easy-java-solution)計算陸地數和相鄰數的解
###### tags: `leetcode`, `leetcode-easy`, `application problem`