解答參考:島嶼數量官方解答
問題描述:
給你乙個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連線形成。此外,你可以假設該網格的四條邊均被水包圍。示例 1:
輸入:grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]輸出:1
演算法思路:
本題可以採用深度優先搜尋、廣度優先搜尋、並查集三種方式求解,本篇文章講解使用並查集的方法
//合併乙個節點就減少乙個節點
--count;}}
public int getcount()
}public int numislands(char grid)
int nr = grid.length;
int nc = grid[0].length;
int num_islands = 0;
unionfind uf = new unionfind(grid);
for (int r = 0; r < nr; r++)
//當前節點的下方節點與當前節點進行合併
if (r + 1 < nr && grid[r+1][c] == '1')
//當前節點的左方節點與當前節點進行合併
if (c - 1 >= 0 && grid[r][c-1] == '1')
//當前節點的右方節點與當前節點進行合併
if (c + 1 < nc && grid[r][c+1] == '1') }}
}return uf.getcount();}}
複雜度分析
時間複雜度:o(mn∗α(mn)),其中 mm 和 nn 分別為行數和列數。注意當使用路徑壓縮(見 find 函式)和按秩合併(見陣列 rank)實現並查集時,單次操作的時間複雜度為 α(mn),其中α(x) 為反阿克曼函式,當自變數 x 的值在人類可觀測的範圍內(宇宙中粒子的數量)時,函式 α(x) 的值不會超過 55,因此也可以看成是常數時間複雜度。空間複雜度:o(mn),這是並查集需要使用的空間。
200 島嶼數量(並查集 DFS)
200.島嶼數量 方法一 dfs或bfs 遍搜尋遍改變,訪問陣列也不需要 class solution,int r int c public intnumislands char grid return res public void dfs int i,int j,char grid return...
200島嶼數量 並查集未寫
給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 輸出 1 示例 2 輸入 輸出 3 public intnumislands char grid int cou...
力扣305,島嶼數量,並查集。
島嶼數量 ii 主要的想法是用並查集,改一下並查集的 就好了。假設每個相鄰的兩個格仔之間有條邊。整體的 感覺還能再優化些。首先將建個m n長的陣列parent,表示每個格仔,m n長的陣列rankx用於路徑壓縮。尋根的函式若parent i i那麼就代表這個i位置就是乙個根節點。find root函...