Longest Consecutive Sequence

LeetCode第128题,在一个序列中找最长的连续序列。要求在O(n)复杂度下完成。
排序是可以完成的,但是复杂度最低也是O(nlogn),因此考虑hash。
hash可以先把每个数存起来,然后遍历这些数,往两边扩展寻找连续的数,如果找到了就在hash里删除这个数。
这里删除操作是核心,因为如果一个数在这个连续序列当中,那么以这个数为中心扩展,找到的仍然是这个连续序列,因此完全不需要再以这个数为中心查找。这样就是看上去整个方法复杂度是O(n^2),实际上只有O(n)的原因。
python版本

class Solution(object):
    def longestConsecutive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        d = {}
        res = 0
        for num in nums:
            d[num] = 1
        for i in nums:
            length = 1
            j = i-1
            while d.has_key(j):
                del d[j] 
                j -= 1
                length += 1
            k = i+1
            while d.has_key(k):
                del d[k]
                k += 1
                length += 1
            res = max(res, length)
        return res

c++大神版本

class Solution {
    public:
        int longestConsecutive(const vector<int> &nums) {
        unordered_set<int> my_set;
        for (auto i : nums) my_set.insert(i);
        int longest = 0;
        for (auto i : nums) {
            int length = 1;
            for (int j = i - 1; my_set.find(j) != my_set.end(); --j) {
            my_set.erase(j);
            ++length;
        }
        for (int j = i + 1; my_set.find(j) != my_set.end(); ++j) {
            my_set.erase(j);
            ++length;
        } 
        longest = max(longest, length);
        } 
        return longest;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值