LeetCode演算法題-Island Perimeter(Java實現)
這是悅樂書的第 238 次更新,第 251 篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第105題(順位題號是463)。您將獲得一個二維整數網格形式的地圖,其中1代表土地,0代表水。網格單元水平/垂直(不是對角線)連線。 網格完全被水包圍,並且恰好有一個島(即,一個或多個連線的陸地小區)。
島上沒有“湖泊”(裡面的水與島周圍的水沒有聯絡)。 一個單元格是邊長為1的正方形。網格為矩形,寬度和高度不超過100。確定島的周長。
輸入:[[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
輸出:16
說明:周邊是下圖中的16條黃色條紋:

image
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
此題的題意是要求我們根據提供的二維陣列,來計算二維陣列中元素為1(代表邊長為1的正方形)所組成圖形的周長。
計算周長,一是需要知道該圖形由多少個小正方形(元素為1)組成,二是減去相鄰小正方形之間重疊的兩邊。我們直接使用兩層迴圈,在內層迴圈中,如果當前元素值為1,表示遇到了正方形,周長就加4,此時我們就需要判斷其右邊和下邊有沒有挨著的正方形,如果有就要減去2,最後返回周長。
public int islandPerimeter(int[][] grid) { if (grid == null || grid.length == 0) { return 0; } int perimeter = 0; for (int i=0; i<grid.length; i++) { for (int j=0; j<grid[0].length; j++) { if (grid[i][j] == 1) { perimeter += 4; // 向右判斷,有重疊就減去2 if (j+1 < grid[i].length && grid[i][j+1] == 1) { perimeter -= 2; } // 向下判斷,有重疊就減去2 if (i+1 < grid.length && grid[i+1][j] == 1) { perimeter -= 2; } } } } return perimeter; }
03 第二種解法
同樣使用兩層迴圈,當某一元素值為1的時候,我們去判斷它的上下左右是不是等於0,從而計算它單獨的邊,即沒有與其他正方形連線的邊,也就是題目示例中,所給圖例中標黃的線。
public int islandPerimeter2(int[][] grid) { if (grid == null || grid.length == 0) { return 0; } int perimeter = 0, len = grid.length, len2 = grid[0].length; for (int i=0; i<len; i++) { for (int j=0; j<len2; j++) { if (grid[i][j] == 1) { if (i == 0 || grid[i-1][j] == 0) { perimeter++; } if (i == len-1 || grid[i+1][j] == 0) { perimeter++; } if (j == 0 || grid[i][j-1] == 0) { perimeter++; } if (j == len2-1 || grid[i][j+1] == 0) { perimeter++; } } } } return perimeter; }
04 小結
演算法專題目前已日更超過三個月,演算法題文章 105 +篇,公眾號對話方塊回覆【 資料結構與演算法 】、【 演算法 】、【 資料結構 】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!