1631. 最小体力消耗路径

并查集代码
"""
    1.这个题目所给的n比较小,所以应该是可以达到o(n**2)的时间复杂度
    2.思路:
        循环坐标
        上下左右连通
        并查集记录最大差值

        遍历记录所有插值的列表
"""
class UFS:
    def __init__(self,n):
        self.parent=[0]*n
        # self.maxset=[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) #将这两个点连通起来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值