该题解使用并查集(Union Find)算法来解决问题。思路是将每个小方格的四个角视为独立的点,通过斜线将这些点连接起来。如果两个点被同一条斜线连接,则它们属于同一个区域。为了处理边界情况,将网格的四条边界也视为被连接起来的。遍历整个网格,根据斜线的位置将点进行合并,如果发现两个点已经在同一个集合中,则说明形成了一个新的区域。
时间复杂度: O(n^2α(n))
空间复杂度: O(n^2)
class Solution:
def regionsBySlashes(self, grid: List[str]) -> int:
n = len(grid)
num_points = (n+1) * (n+1)
uf = WeightedUnionFindWithCompressedPath(num_points)
# Connect the edges of the grid
for i in range(n):
uf.union(i, i+1)
for i in range(n):
uf.union(n*(n+1)+i, n*(n+1)+i+1)
for j in range(n):
uf.union((n+1)*j, (n+1)*(j+1))
for j in range(n):
uf.union((n+1)*j + n, (n+1)*(j+1) + n)
num_area = 1
for i in range(n):
for j in range(n):
if grid[i][j] == ' ':
continue
# Determine the points to be connected based on the slash
if grid[i][j] == '/':
p1 = i * (n+1) + j + 1
p2 = (i+1) * (n+1) + j
else:
p1 = i * (n+1) + j
p2 = (i+1) * (n+1) + j + 1
# If the points are already connected, a new area is formed
if uf.connected(p1, p2):
num_area += 1
continue
uf.union(p1, p2)
return num_area
class WeightedUnionFindWithCompressedPath(object):
def __init__(self, n):
self.parent = [i for i in range(n)]
self.size = [1 for _ in range(n)]
self.count = n
def find(self, p):
# Path compression
node = p
while self.parent[node] != node:
node = self.parent[node]
root = node
node = p
while self.parent[node] != node:
parent = self.parent[node]
if self.parent[node] != root:
self.parent[node] = root
self.size[parent] -= self.size[node]
node = parent
return root
def connected(self, p, q):
return self.find(p) == self.find(q)
def union(self, p, q):
root_p = self.find(p)
root_q = self.find(q)
if root_p == root_q:
return
# Weighted union
if self.size[root_p] < self.size[root_q]:
self.parent[root_p] = root_q
self.size[root_q] += self.size[root_p]
else:
self.parent[root_q] = root_p
self.size[root_p] += self.size[root_q]
self.count -= 1