【最长连续序列】python刷题记录

目录

并查集

初始化:

 find函数

union函数

并查集的优化:

思路:

代码: 

结果:

 ps:

重大调整PS:

调整一下刷题顺序,之前是按照模块,但现在觉得模块太单调了,决定每个=次循环都抽取模块中的一道中等题来刷,毕竟算法都学过。

难点:O(n)复杂度,所以直接拿去排序不太行

并查集

并查集_哔哩哔哩_bilibili

初始化:

创建parent数组,每一个i点对应的值都是其父节点 

 

 find函数

--------查找parent数组直到-1返回i(集合树的根)

 

union函数

例如union(3,6)

先find(3),再find(6),如果r1!=r2,那么将parent数组中的r2的parent赋值为r1

 

并查集的优化:

把同一个parent单路上的parent修改为root

例如左图单路修改后为右图所示

 

思路:

将每个数字看成一个节点,连接的关系就是数值比他大1。即可以看成是求满足条件建树的最大树的节点个数。

代码:

 

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        #相同元素没有意义,可以舍弃
        nums=set(nums)
        ans=0

        #并查集
        #值为离散的,使用字典
        #准备用做parent字典
        fa={num:num for num in nums}
        #对于每个数字来说,以它开始的最长连续初始都为1
        size={num:1 for num in nums}

        def find(x):
            if fa[x]!=x:
                fa[x]=find(fa[x])
            return fa[x]
        
        def union(f,to):
            f=find(f)
            to=find(to)
            if f!=to:
                fa[f]=to
                size[to]+=size[f]

        #遍历数组,满足union时,取max
        for num in nums:
            if num+1 in fa:
                union(num,num+1)
        #size.values()当size是字典是能取所有的值出来
        if size:
            ans=max(size.values())
        return ans

结果:

 ps:

size.values()当size是字典是能取所有的值出来

感谢伪灵神!!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 06:44:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 06:44:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 06:44:01       58 阅读
  4. Python语言-面向对象

    2024-07-19 06:44:01       69 阅读

热门阅读

  1. 低代码前端框架Amis全面教程

    2024-07-19 06:44:01       17 阅读
  2. git-各种场景-撤销指令

    2024-07-19 06:44:01       19 阅读
  3. Stripe web 支付语言设置

    2024-07-19 06:44:01       19 阅读
  4. git-指令 -stash暂存

    2024-07-19 06:44:01       19 阅读
  5. [C/C++入门][for]25、药房管理(循环经典练习)

    2024-07-19 06:44:01       20 阅读
  6. golang 实现负载均衡器-负载均衡原理介绍

    2024-07-19 06:44:01       23 阅读