305 島嶼數量 II

2022-05-08 22:06:12 字數 2404 閱讀 4479

假設你設計乙個遊戲,用乙個 m 行 n 列的 2d 網格來儲存你的遊戲地圖。

起始的時候,每個格仔的地形都被預設標記為「水」。我們可以通過使用 addland 進行操作,將位置 (row, col) 的「水」變成「陸地」。

你將會被給定乙個列表,來記錄所有需要被操作的位置,然後你需要返回計算出來 每次 addland 操作後島嶼的數量。

注意:乙個島的定義是被「水」包圍的「陸地」,通過水平方向或者垂直方向上相鄰的陸地連線而成。你可以假設地圖網格的四邊均被無邊無際的「水」所包圍。

請仔細閱讀下方示例與解析,更加深入了解島嶼的判定。

示例:輸入: m = 3, n = 3, positions = [[0,0], [0,1], [1,2], [2,1]]

輸出: [1,1,2,3]

解析:起初,二維網格 grid 被全部注入「水」。(0 代表「水」,1 代表「陸地」)

0 0 0

0 0 0

0 0 0

操作 #1:addland(0, 0) 將 grid[0][0] 的水變為陸地。

1 0 0

0 0 0 number of islands = 1

0 0 0

操作 #2:addland(0, 1) 將 grid[0][1] 的水變為陸地。

1 1 0

0 0 0 島嶼的數量為 1

0 0 0

操作 #3:addland(1, 2) 將 grid[1][2] 的水變為陸地。

1 1 0

0 0 1 島嶼的數量為 2

0 0 0

操作 #4:addland(2, 1) 將 grid[2][1] 的水變為陸地。

1 1 0

0 0 1 島嶼的數量為 3

0 1 0

拓展:你是否能在 o(k log mn) 的時間複雜度程度內完成每次的計算?(k 表示 positions 的長度)

首先我想到的就是dfs,每次加入陸地的時候考察一共有多少島嶼。但不能每次加入陸地都遍歷全部矩陣,這樣複雜度太高了,需要剪枝。

我的思路是這樣:

每個獨立的島嶼有獨特的編號。每次addland的時候,遍歷周邊四個位置。

1.如果有乙個相鄰島嶼,島嶼數--,儲存這個相鄰島嶼的編號。

2.如果有第二個、甚至第

三、四個相鄰島嶼,就把之後的相鄰的島嶼都用dfs遍歷,全部更新為第乙個相鄰島嶼的編號。每次仍然記得總島嶼數--。

3.如果沒有相鄰島嶼,直接賦島嶼編號,全域性的島嶼編號加一。

1

class

solution ,,,};

4int

m,n;

5bool check(int x,inty)9

return

true;10

}11 vector numislands2(int m, int n, vectorint>>&positions)

24 res[i]=res[i-1]+1;25

int x=positions[i][0],y=positions[i][1],cur_val=0;26

//cout<

for(int j=0;j<4;++j)

34else

if(matrix[new_x][new_y]!=0)38}

39}40 matrix[x][y]=cur_val==0?val++:cur_val;

41//

for(auto& vec:matrix)cout<45//}

46}47return

res;48}

4950

void dfs(vectorint>>& matrix,int x,int y,int ori_val,int

new_val)60}

61}62 };

使用並差集。

1

class

solution ,,,};4//

並差集5 vectorparents;

力扣305,島嶼數量,並查集。

島嶼數量 ii 主要的想法是用並查集,改一下並查集的 就好了。假設每個相鄰的兩個格仔之間有條邊。整體的 感覺還能再優化些。首先將建個m n長的陣列parent,表示每個格仔,m n長的陣列rankx用於路徑壓縮。尋根的函式若parent i i那麼就代表這個i位置就是乙個根節點。find root函...

200 島嶼數量

複雜度分析 時間複雜度 o m n 其中 m 和 n 分別為行數和列數。空間複雜度 最壞情況下為 o m n 此時整個網格均為陸地,深度優先搜尋的深度達到m n。class solution int numislands vector grid int cnt 0 for int i 0 i gri...

200 島嶼數量

leetcode 200.島嶼數量 島嶼另一種型別 求周長 leetcoed 463.島嶼的周長 廣度優先遍歷 bfs 深度優先遍歷 dfs 2.1 dfs 就是遇到乙個 1 遞迴下去繼續找 1 四周沒有 1 之後,逐層返回到上一層找四周剩餘的 1 本題不需要回溯 直接把 訪問過的標記即可 廣度優先...