1. 程式人生 > >Island Perimeter Leetcode

Island Perimeter Leetcode

ret ive dimens ont 遍歷 have 個數 lean doesn

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的話周長就減1的做法做的。
public class Solution {
    public int islandPerimeter(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    count += 4 + isOne(grid, i, j);
                }
            }
        }
        return count;
    }
    private boolean inBound(int[][] grid, int x, int y) {
        if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) {
            return false;
        }
        return true;
    }
    private int isOne(int[][] grid, int x, int y) {
        int count = 0;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        for (int i = 0; i < 4; i++) {
            int newX = x + dx[i];
            int newY = y + dy[i];
            if (inBound(grid, newX, newY) && grid[newX][newY] == 1) {
                count--;
            }
        }
        return count;
    }
}

做的可能有點復雜了,因為還有更好的做法。只要遍歷右邊和下邊就可以了。最後結果是島的個數 * 4 - 2 * 右邊和下邊的個數。因為右邊和下邊代表有兩個島要減一,所以乘2。

public class Solution {
    public int islandPerimeter(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    count += 4;
                    if (i + 1 < grid.length && grid[i + 1][j] == 1) {
                        count -= 2;
                    }
                    if (j + 1 < grid[0].length && grid[i][j + 1] == 1) {
                        count -= 2;
                    }
                }
            }
        }
        return count;
    }
}

Island Perimeter Leetcode