LeetCode | 463. 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


这道题在Judging有时会莫名其妙地判超时,不一定是代码时间复杂度不好,再提交一次说不定就通过了,LeetCode最近有点问题。
相当简单的一道题,计算陆地周长,最容易想到的方法就是将总的方块的边数减去连接处的边数,代码如下:

public class Solution {
    public int islandPerimeter(int[][] grid) {
        int numbers = 0;
        //先计算出矩阵中1的个数
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[i].length; j++) {
                if(grid[i][j] == 1) numbers ++;
            }
        }

        //得到忽略连接处下总边数
        int initial = numbers * 4;

        //再计算连接处个数
        int connected = 0;
        //第一次双重循环是一列一列地算出连接处
        for(int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length - 1; j++) {
                if(grid[i][j] == 1 && grid[i][j + 1] == 1) connected++;
            }
        }
        //第二次双重循环是一行一行地算出连接处
        for(int i = 0; i < grid.length - 1; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if(grid[i][j] == 1 && grid[i + 1][j] == 1) connected++;
            }
        }

        //一个连接处代表着两个边抹去
        return initial - connected * 2;
    }
}
发布了84 篇原创文章 · 获赞 0 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章