題目如下:
給定一個包含 0 和 1 的二維網(wǎng)格地圖蜘拉,其中 1 表示陸地 0 表示水域嘹裂。
網(wǎng)格中的格子水平和垂直方向相連(對角線方向不相連)市框。整個網(wǎng)格被水完全包圍,但其中恰好有一個島嶼(或者說佑笋,一個或多個表示陸地的格子相連組成的島嶼)翼闹。
島嶼中沒有“湖”(“湖” 指水域在島嶼內(nèi)部且不和島嶼周圍的水相連)。格子是邊長為 1 的正方形允青。網(wǎng)格為長方形橄碾,且寬度和高度均不超過 100 卵沉。計(jì)算這個島嶼的周長。
示例 :
輸入:
[[0,1,0,0],
[1,1,1,0],
[0,1,0,0],
[1,1,0,0]]輸出: 16
解釋: 它的周長是下面圖片中的 16 個黃色的邊:
解題思路如下:
剛拿到這道題時法牲,好長時間一籌莫展史汗,最后是看了別人的答案才慢慢把思路給捋順的;
整體思路是先加后減拒垃,只要遍歷到陸地就加 4停撞,同時上和左有陸地接壤時再減去 2;
也看到有人的解題思路是每次判斷當(dāng)前陸地的上下左右 4 個方向上是否有陸地悼瓮,有一塊陸地減 1戈毒,有兩塊陸地減 2,有三塊陸地減 3横堡,有四塊陸地減 4埋市;
不過這個思路不如上一個思路優(yōu)秀,這個每次要判斷 4 次命贴,上一個思路道宅,每次只用判斷 2 次(上和左兩個方向);
把第一個思路細(xì)分一下胸蛛,步驟如下:
- 遍歷每一個方格污茵,遇到陸地就加 4;
- 同時葬项,如果當(dāng)前陸地的上方也是陸地泞当,則從結(jié)果中減去 2;
- 同時民珍,如果當(dāng)前陸地的左邊也是陸地襟士,則從結(jié)果中減去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) {
//遍歷時遇到陸地穷缤,先給結(jié)果加 4
result += 4;
if (i > 0 && grid[i - 1][j] == 1) {
//如果當(dāng)前陸地的上邊也有陸地敌蜂,剛這兩塊陸地因?yàn)榻尤缆崾蓿瑥慕Y(jié)果中減去各自的一條邊
result -= 2;
}
if (j > 0 && grid[i][j - 1] == 1) {
//如果當(dāng)前陸地的左側(cè)也有一塊陸地津肛,則這兩塊陸地因?yàn)榻尤溃瑥慕Y(jié)果中減去各自的一條邊
result -= 2;
}
}
}
}
return result;
}
}