[python]leetcode(128). Longest Consecutive Sequence

problem

Given an unsorted array of integers, find the length of the longest
consecutive elements sequence.

For example, Given [100, 4, 200, 1, 3, 2], The longest consecutive
elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

solution

可以把这个问题考虑为数字在数轴上的覆盖,我们使用一个哈希表存储连续数值的端点和对应的长度,这样如果新遍历的数左边或右边可以和已有的区间连上的话就可以对原有的区间进行扩张。

class Solution(object):
    def longestConsecutive(self, nums):

        n = len(nums)
        d = {}
        ans = 0
        for i in nums:
            if i not in d:
                left = d.get(i-1, 0)
                right = d.get(i+1, 0)
                length = left + right + 1
                ans = max(ans, length)

                d[i] = length
                d[i-left] = length
                d[i+right] = length

        return ans

总结

  1. 重复数字直接跳过就行,不用删除记录
  2. 对于左右两个区间是否存在的情况,不用使用条件判断,直接把左右长度记录下来就行,然后根据数值进行处理。
  3. 存储时尽量存储原始值,也就是区间的端点,不用+1或-1,在遍历时处理这些细节就行(我之前就是存储的+1或-1,这样会出现两个数组夹着一个数的情况,不好处理),所以使用hash表时尽量避免key碰撞
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值