用python写leetcode【15】 -- 最长连续序列(128)

最长连续序列(128)

题目

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

思路

我的想法是,建立一个字典m,key是数字,value是对应的该数字连续的长度,更新的方法是对于遍历的每一个数k,如果k-1或者k+1已经存在在字典里,那就将m[k]设定为m[k+1]+m[k-1]+1,即将前后两传序列连接了,同时将这一整条序列的两端的数字在字典的值也更新(不用更新序列中间的数,因为不会再被使用)。
顺便看了答案最快的,感觉这个最快的方法并不是O(n)的只不过是由于数据集大部分的情况而导致速度比较快。

代码


我的方法:
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        m = {}
        ans = 0
        for i in set(nums):
            n = 1
            left = 0
            right = 0
            if i-1 in m:
                n+=m[i-1]
                left = m[i-1]
            if i+1 in m :
                n+=m[i+1]
                right = m[i+1]
            m[i]=n
            m[i-left]=n
            m[i+right] = n
            
            if m[i]>ans:
                ans = m[i]
           # print(m)
        
        return ans

答案最快的:
class Solution:
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums=set(nums)
        ma=0
        for x in nums:
            if x-1 not in nums:
                y=x+1
                while y in nums:
                    y+=1
                ma=max(ma,y-x)
        return ma
  ···
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值