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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章