[LeetCode463]Island Perimeter岛屿周长问题

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

原题链接:https://leetcode.com/problems/island-perimeter/#/description

大意:给定一个二维数组,数字”1”代表岛屿,“0”代表湖水,求岛屿的周长(下图中黄色边的个数)

Explanation: The perimeter is the 16 yellow stripes in the image below:
[LeetCode463]Island Perimeter岛屿周长问题_第1张图片

先计算1(岛屿)的数量,然后依次往右下遍历(这样不重复),计算相邻的格子的数量,每出现一次相邻,去掉2个边
(一个单独的岛屿占四个边,但:若出现相邻岛屿之后就要去掉重合的两个边)
思路正确之后,确保遍历不重复即可。

public class Solution {
   public int islandPerimeter(int[][] grid) {
        int count = 0;//记录1的数量(岛屿)
        for (int[] i : grid) {
            for (int j = 0; j != i.length; j++)
                count += i[j];
        }
        return 4*count-2*search(grid);
    }


    public int search(int[][] grid) {
        int row = grid.length;
        int col = grid[0].length;
        int calculator = 0;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == 1) {
                    if (i < row - 1 && grid[i + 1][j] == 1) { //往下
                        calculator++;
                    }
                    if (j < col - 1 && grid[i][j + 1] == 1) { //往右
                        calculator++;
                    }
                }
            }
        }
        return calculator;
    }
}

作者:邱钟浩:原文地址

你可能感兴趣的:(Android)