本文共 1490 字,大约阅读时间需要 4 分钟。
将球的运动问题转化为图论模型后,可以用并查集(Union-Find)结构来解决。每个网格单元格视为图中的一点,两个相邻的单元格如果方向相同,就像一条边。球的运动路径即沿着这些边移动,问题转化为查找每个起点最终连接的点,以确定球的最终位置。
模型转化:将网格中的每个单元格视为图中的点。判断球从一个单元格是否可以移动到下方的单元格,如果方向一致,则形成边。
并查集:并查集用来高效判断和处理连通性,每个单元格作为一个节点。合并相连的节点,形成连通块。
处理每个起点:对于顶部各列的单元格,查找其连通块的根节点。如果根节点在最底部,则返回该单元格的列号;否则,球卡住返回-1。
class UnionFindSet: def __init__(self, size): self.parent = list(range(size)) def find(self, x): while self.parent[x] != x: self.parent[x] = self.parent[self.parent[x]] x = self.parent[x] return x def union(self, x, y): fx = self.find(x) fy = self.find(y) if fx == fy: return False self.parent[fy] = fx return Truedef find_ball(grid): m = len(grid) n = len(grid[0]) if m > 0 else 0 uf = UnionFindSet((m + 2) * (n + 2)) for i in range(m): for j in range(n): val = grid[i][j] ni, nj = i + 1, j + val if 0 <= ni < m and 0 <= nj < n: if grid[ni][nj] == val: uf.union(i * n + j, ni * n + nj) result = [-1] * n for j in range(n): root = uf.find(j) row = root // n col = root % n if row == m - 1: result[j] = col return result
find
方法使用路径压缩,union
方法通过 union-by-rank 合并,以确保树保持平衡,提高效率。这种方法高效地解决了问题,适用于给定的问题规模,时间复杂度为 O(mn)。
转载地址:http://fowrz.baihongyu.com/