欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Leetcode:128最长连续序列

程序员文章站 2024-02-25 09:41:28
...

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

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

示例:

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

思路:时间复杂度为O(n),排除排序;以开辟空间来节约时间,引入哈希表,一次遍历得到数组各个位置对应的连续序列长度。即键:数组的元素,值:连续序列长度。

分解示意图:

第一步,哈希表插入100,对应连续序列长度为  left(100-1)的值+right(100+1)值+1 :lenth = dic[left]+dic[right]+1

key 99(不存在) 100(insert) 101(不存在)  
val 0 0+0+1 0  

遍历到数组最后一个元素2时:

key   1 2 3(insert) 4
val   2 2 2+1+1 1

得出此时lenth = 2+1+1=4

此时应该更改其最左和最右端的lenth值

key   1 2 3(insert) 4
val   4 4(2) 4(whatever) 4

注意:中间的值不会再访问,所以任取即可。序列端点的值需要准确计算。

完整代码:

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        dic = {}
        maxi = 0
        for num in nums:
            if num not in dic:
                left,right = dic.get(num-1,0),dic.get(num+1,0)
                lenth = left+right+1
                #随机设定即可,但确保有值,不重复计算其左右,连续区间端点值确定即可,也可以将内部设定为统一值
                dic[num] = 0#lenth
                dic[num-left]=lenth
                dic[num+right]=lenth
                maxi = max(maxi,lenth)
        return maxi