并查集代码
"""
1.这个题目所给的n比较小,所以应该是可以达到o(n**2)的时间复杂度
2.思路:
循环坐标
上下左右连通
并查集记录最大差值
遍历记录所有插值的列表
"""
class UFS:
def __init__(self,n):
self.parent=[0]*n
for i in range(n):
self.parent[i]=i
def find(self,node):
father=self.parent[node]
if node==father:
return node
self.parent[node]=self.find(father)
return self.parent[node]
def union(self,node_a,node_b):
f_a=self.find(node_a)
f_b=self.find(node_b)
if f_a!=f_b:
self.parent[f_a]=f_b
def is_same_set(self,nodea,nodeb):
return self.find(nodea)==self.find(nodeb)
最开始的方法一,无法通过的代码
原因在于思考到并查集是解决连通性问题
所以把所有元素都走一步
但其实没有进行区分,导致分不清楚路径之间的关系,只知道是连通的
再次理解题目,要的就是说差值小的,无所谓路径的长度(这个题目没有管这个)
所以完全可以把所有差值(这两个之间要是上下左右关系)记录下来,从小到大排列
遍历,将其放入并查集中,这样看起点和终点是否达到了连通状态,那么就是这个结果
"""
这就是一个错误的思路
为什么,因为这仅仅考虑到了连通性的问题
没有将差理解清楚
其实无论你如何连接,一定是连通的
"""
def fun1(heights):
row=len(heights)
col=len(heights[0])
ufs=UFS(row*col)
"""把所有的数据中可以连通的都连通起来了"""
for i in range(row):
for j in range(col):
cur=i*col+j
if i>0:
ufs.union(cur-col,cur)
if j>0:
ufs.union(cur-1, cur)