463. 岛屿的周长『简单』

题目来源于力扣(LeetCode

一、题目

463. 岛屿的周长

题目相关标签:哈希表

二、解题思路

  1. 遍历数组,对于数组中为 1 的元素,直接加上全部的 4 条边,即周长为 4

  2. 在出现元素 1 的基础上,再判断其左边(即前一位元素)与其上面(即前一数组的相同索引)的元素是否也等于 1

  3. 其相邻元素也相等 1 时,需要进行减边的操作

  4. 两个陆地的相邻时,需要在两个周长为 4 的结果中再减 2,因为相邻的两个陆地的两条邻接线是不需要的,即不计算其周长

三、代码实现

public static int islandPerimeter(int[][] grid) {
    // 排除特殊情况
    if (grid == null || grid.length == 0) {
        return 0;
    }
    // 记录周长,即多少条边
    int count = 0;
    // 遍历二维数组
    for (int i = 0; i < grid.length; i++) {
        int[] arr = grid[0];
        for (int j = 0; j < arr.length; j++) {
            // 元素为 1 时,说明为一个“陆地”
            if (grid[i][j] == 1) {
                // 一块陆地最多有 4 个边,即周长为 4
                count += 4;
                // 同水平线上左边有 “陆地” 时,减两条边:格子自身的左侧边和左边格子的右侧边
                if (i > 0 && grid[i - 1][j] == 1) {
                    count -= 2;
                }
                // 同垂直线上上面有 “陆地” 时,减两条边:格子自身的上侧边和上面格子的下面边
                if (j > 0 && grid[i][j - 1] == 1) {
                    count -= 2;
                }
            }
        }
    }
    return count;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    int[][] grid = {{0, 1, 0, 0},
                    {1, 1, 1, 0},
                    {0, 1, 0, 0},
                    {1, 1, 0, 0}};  // output:16
    int result = islandPerimeter(grid);
    System.out.println(result);
}
posted @ 2020-05-21 22:04  知音12138  阅读(148)  评论(0编辑  收藏  举报