1. 程式人生 > >LeetCode-Island Perimeter

LeetCode-Island Perimeter

Description: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). The island doesn’t have “lakes” (water inside that isn’t connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don’t exceed 100. Determine the perimeter of the island.

Example:

[[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: 在這裡插入圖片描述

題意:在一個網格中,用1代表一個島嶼,用0代表海水,現在要求計算所有的島嶼的周長;

解法:對於每個島嶼來說,其周長為4,每相鄰另外一個島嶼其周長減1,因此,我們遍歷整個網格中所有的島嶼,在其初始周長4的前提下,減去相鄰的島嶼數,最後對有的的島嶼的周長累加得到結果;

Java
class Solution {
    public int islandPerimeter(int[][] grid) {
        int result = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == 1) {
                    result += 4 - aroundCell(grid, i, j);
                }
            }
        }
        return result;
    }
    
    private int aroundCell(int[][] grid, int row, int col) {
        int cnt = 0;
        if (row - 1 >= 0 && grid[row - 1][col] == 1) cnt++;
        if (col - 1 >= 0 && grid[row][col - 1] == 1) cnt++;
        if (row + 1 < grid.length && grid[row + 1][col] == 1) cnt++;
        if (col + 1 < grid[row].length && grid[row][col + 1] == 1) cnt++;
        return cnt;
    }
}