128. 最长连续序列

这道题目在官方解法中使用的是哈希表,但因为我想要学一下并查集,所以这里采用的是并查集写法
思路:
	首先要求找到,最长连续序列,1,2,3,4,5
	可知,相差绝对值==1的是可以放在一个区域内的
	这就变成了连通性问题,abs()==1则连通,否则不连通
	那么可使用并查集,解决该问题
	同时在这个过程中nums[i]可能达到10**9所以采用下标替代(hash映射)
	只要相减==1就可以连在一起

题目

class UFS:
    def __init__(self,n):
        self.parent=[0]*(n+1)
        self.sizeset=[1]*(n+1)
        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,head_a,head_b):
        father_a=self.find(head_a)
        father_b=self.find(head_b)
        if father_a!=father_b:
            self.parent[father_a]=father_b
            self.sizeset[father_b]+=self.sizeset[father_a]
def fun1(nums):
    if nums == []:
        return 0
    # 将数字与下标做映射,这样可以让并查集不需要开太大,并且这样已经去重了
    hash = {}
    for i in range(len(nums)):
        hash[nums[i]] = i
    n = len(nums)
    ufs = UFS(n)
    for key, value in hash.items():
        if key - 1 in hash:
            ufs.union(hash[key - 1], value)
        if key + 1 in hash:
            ufs.union(hash[key + 1], value)
    max_ = 0
    for item in ufs.sizeset:
        max_ = max(item, max_)
    return max_
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值