【LeetCode】463. 島嶼的周長(Island Perimeter)的解題思路

題目如下:

給定一個包含 0 和 1 的二維網格地圖,其中 1 表示陸地 0 表示水域。

網格中的格子水平和垂直方向相連(對角線方向不相連)。整個網格被水完全包圍,但其中恰好有一個島嶼(或者說,一個或多個表示陸地的格子相連組成的島嶼)。

島嶼中沒有“湖”(“湖” 指水域在島嶼內部且不和島嶼周圍的水相連)。格子是邊長爲 1 的正方形。網格爲長方形,且寬度和高度均不超過 100 。計算這個島嶼的周長。

示例 :

輸入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]

輸出: 16

解釋: 它的周長是下面圖片中的 16 個黃色的邊:

解題思路如下:

剛拿到這道題時,好長時間一籌莫展,最後是看了別人的答案才慢慢把思路給捋順的;

整體思路是先加後減,只要遍歷到陸地就加 4,同時上和左有陸地接壤時再減去 2;

也看到有人的解題思路是每次判斷當前陸地的上下左右 4 個方向上是否有陸地,有一塊陸地減 1,有兩塊陸地減 2,有三塊陸地減 3,有四塊陸地減 4;

不過這個思路不如上一個思路優秀,這個每次要判斷 4 次,上一個思路,每次只用判斷 2 次(上和左兩個方向);

把第一個思路細分一下,步驟如下:

  1. 遍歷每一個方格,遇到陸地就加 4;
  2. 同時,如果當前陸地的上方也是陸地,則從結果中減去 2;
  3. 同時,如果當前陸地的左邊也是陸地,則從結果中減去2;

然後是代碼:

class Solution {
    public int islandPerimeter(int[][] grid) {
        if (grid == null || grid.length == 0) {
			return 0;
		}
		int result = 0;
		for (int i = 0; i < grid.length; i++) {
			for (int j = 0; j < grid[i].length; j++) {
				if (grid[i][j] == 1) {
					//遍歷時遇到陸地,先給結果加 4
					result += 4;
					if (i > 0 && grid[i - 1][j] == 1) {
						//如果當前陸地的上邊也有陸地,剛這兩塊陸地因爲接壤,從結果中減去各自的一條邊
						result -= 2;
					}
					if (j > 0 && grid[i][j - 1] == 1) {
						//如果當前陸地的左側也有一塊陸地,則這兩塊陸地因爲接壤,從結果中減去各自的一條邊
						result -= 2;
					}

				}
			}
		}
		return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章