Python算法题集_最长连续序列

本文介绍了如何使用Python实现一个时间复杂度为O(n)的算法来找到给定未排序整数数组中数字连续的最长序列。文中提供了两种方法:一种是利用字典记录每个数的边界,另一种是利用集合快速查找连续区间。示例代码展示了这两种方法的实现和应用。
摘要由CSDN通过智能技术生成

本文为Python算法题集之一的代码示例

题目128:最长连续序列

说明:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度,设计并实现时间复杂度为 O(n) 的算法解决此问题

  1. 正确但超时【使用list.sort()或者sorted(list),定会超时,因为list实际是链表】

    def find_consecutive_length(nums):
        if not nums:
            return 0
        sortNum = sorted(nums)    #超时元凶
        max_length = 0
        current_length = 1
        lastnum = sortNum[0] - 1
        for num in sortNum:
            if num == lastnum:    #检测中去重
                continue
            lastnum = num
            if num + 1 in sortNum:
                current_length += 1
            else:
                max_length = max(max_length, current_length)
                current_length = 1
        return max(max_length, current_length)
    
    numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1]
    print(find_consecutive_length(anums))
    # 运行结果
    # 9
    
  2. 字典法【使用字典dict进行检索】

    def find_consecutive_length(nums):
        if not nums:
            return 0
        record = dict()
        res = 0
        for num in nums:
            if num not in record:
                #寻找当前值的左边界和右边界是否中断
                left = record.get(num - 1, 0)
                right = record.get(num + 1, 0)
                length = right + left + 1
                #修正左右边界的计数
                record[num] = length	
                if left > 0:
                    record[num - left] = length
                if right > 0:
                    record[num + right] = length
                res = max(res, length)
        return res
     
    numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1]
    print(find_consecutive_length(anums))
    # 运行结果
    # 9
    
  3. 集合法【使用集合set进行检索】

    def find_consecutive_length(nums):
        if not nums:
            return 0
        num_set = set(nums)
        find_set = set()
        imax_len = 0
        for anum in num_set:
            if anum in find_set:
                continue
            find_set.add(anum)
            icurr_len = 1
    		#计算左边界
            tmpnum = anum
            while tmpnum - 1 in num_set:
                icurr_len += 1
                find_set.add(tmpnum - 1)
                tmpnum -= 1
    		#计算右边界
            tmpnum = anum
            while tmpnum + 1 in num_set:
                icurr_len += 1
             find_set.add(tmpnum - 1)
                tmpnum += 1
    		#更新最长计数器
            if icurr_len > imax_len:
                imax_len = icurr_len
        return imax_len
     
    numsa = [0,3,7,2,5,8,4,24,6,0,28,30,1]
    print(find_consecutive_length(anums))
    # 运行结果
    # 9
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长孤秋落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值