今天是2023年4月20日,星期一。
給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
示例 1:
輸入:
11110
11010
11000
00000
輸出: 1
示例 2:
輸入:
11000
11000
00100
00011
輸出: 3
解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連線而成。
可以看出這個問題是乙個典型的bfs問題。在bfs問題中,我們通常借助佇列+標識陣列來完成廣度優先遍歷。推薦去看一下weiwei大佬的題解,出門右**島嶼數量。
在遍歷陣列的過程中,每次向其餘四個方向進行尋找,如果已經訪問過該元素,或者該元素不為』1』,則不處理;否則一定滿足該元素未被訪問過 && 該元素未'1'
,此時島嶼數量需要加1,並搜尋該元素的四周。
該題目還可以使用深度優先遍歷dfs來解決。在向乙個方向搜尋時,不斷搜尋,直到搜尋到某乙個元素的值不為』1』。在weiwei大佬的題解中有動態圖示來進行展示,這裡就不在贅述。
public int numislands(char grid)
// 記錄是否某個元素已經訪問過了
boolean flag = new boolean[rows][cols];
// 記錄島嶼的個數
int count = 0;
int distancex = ;
int distancey = ;
for (int row = 0; row < rows; row++) );
while (!queue.isempty()) );}}
}}}}
return count;
}
/**
* 題目參考weiwei大佬的dfs完成
* * @param grid
* @return
*/public int numislands(char grid)
int cols = grid[0].length;
boolean flag = new boolean[rows][cols];
int count = 0;
for (int row = 0; row < rows; row++) }}
return count;
}private void dfs(int x, int y, boolean flag, int rows, int cols, char grid) ;
int distancey = ;
flag[x][y] = true;
for (int i = 0; i < 4; i++)
}}private boolean inarea(int x, int y, int rows, int cols)
每日一題 島嶼數量
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例1 輸入 11110 11010 11000 00000 輸出 1 示例2 輸入 11000 1...
每日一題打卡 200 島嶼的數量
給你乙個由 1 陸地 和 0 水 組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和 或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1 輸入 11110 11010 11000 00000 輸出 1 我的解答 深度優先遍歷 c...
10 30 每日一題 463 島嶼的周長
給定乙個包含0和1的二維網格地圖,其中1表示陸地0表示水域。網格中的格仔水平和垂直方向相連 對角線方向不相連 整個網格被水完全包圍,但其中恰好有乙個島嶼 或者說,乙個或多個表示陸地的格仔相連組成的島嶼 島嶼中沒有 湖 湖 指水域在島嶼內部且不和島嶼周圍的水相連 格仔是邊長為1的正方形。網格為長方形,...