並查集 島嶼數量

2021-10-18 04:58:55 字數 1487 閱讀 6526

解答參考:島嶼數量官方解答

問題描述

給你乙個由 '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函...