305. Number of Islands II (并查集)
Hard
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand operation which turns the water at position (row, col) into a land. Given a list of positions to operate, count the number of islands after each addLand operation. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example:
Input: m = 3, n = 3, positions = [[0,0], [0,1], [1,2], [2,1]] Output: [1,1,2,3]
Explanation:
Initially, the 2d grid grid is filled with water. (Assume 0 represents water and 1 represents land).
0 0 0 0 0 0 0 0 0
Operation #1: addLand(0, 0) turns the water at grid[0][0] into a land.
1 0 0 0 0 0 Number of islands = 1 0 0 0
Operation #2: addLand(0, 1) turns the water at grid[0][1] into a land.
1 1 0 0 0 0 Number of islands = 1 0 0 0
Operation #3: addLand(1, 2) turns the water at grid[1][2] into a land.
1 1 0 0 0 1 Number of islands = 2 0 0 0
Operation #4: addLand(2, 1) turns the water at grid[2][1] into a land.
1 1 0 0 0 1 Number of islands = 3 0 1 0
Follow up:
Can you do it in time complexity O(k log mn), where k is the length of the positions?
思路:
参考 https://www.cnblogs.com/grandyang/p/5190419.html
class Solution:
def numIslands2(self, m: int, n: int, positions: List[List[int]]) -> List[int]:
roots = [-1] * (m * n)
def findRoot(n):
if n == roots[n]:
return n
roots[n] = findRoot(roots[n])
return roots[n]
cnt = 0
rlt = []
for px, py in positions:
num = px * n + py
if roots[num] != -1:
rlt.append(cnt)
continue
roots[num] = num
cnt += 1
direction = [[0, -1], [-1, 0], [0, 1], [1, 0]]
for a, b in direction:
x, y = a + px, b + py
curr_num = x * n + y
if x >= 0 and x < m and y >= 0 and y < n and roots[curr_num] != -1:
p, q = findRoot(curr_num), num
if p != q:
roots[p] = q
cnt -= 1
rlt.append(cnt)
return rlt
本文介绍如何使用并查集算法解决动态增加陆地后的岛屿数量计算问题,通过实例展示算法过程,包括初始化地图、执行操作及计算岛屿数量。
&spm=1001.2101.3001.5002&articleId=107906327&d=1&t=3&u=df1180ad0eeb4e4e98e1871b8bd0f04d)
472

被折叠的 条评论
为什么被折叠?



