LeetCode题解: Longest Consecutive Sequence

Longest Consecutive Sequence

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.

思路:

题目的困难之处在于,要求O(n)的时间复杂度。这样对每个数字的查询,插入,删除都必须是O(1)的水平。满足这个条件的就是unordered_set这种基于hash的容器了。首先选择一个数字,然后向左向右拓展成一个区间,直到区间左右的数字都不在给定的数组内。最后测量区间的长度,找到最长的区间。

题解:

class Solution {
public:
    int longestConsecutive(vector<int> &num) {
        unordered_set<int> hash_num;
        for(auto& n : num)
            hash_num.insert(n);
            
        int max_len = 0;
        while(!hash_num.empty())
        {
            int num = *begin(hash_num);
            hash_num.erase(begin(hash_num));
            
            int left = num;
            int right = num;
            
            auto liter = hash_num.find(left - 1);
            while(liter != hash_num.end())
            {
                hash_num.erase(liter);
                left -= 1;
                liter = hash_num.find(left - 1);
            }            
            
            auto riter = hash_num.find(right + 1);
            while(riter != hash_num.end())
            {
                hash_num.erase(riter);
                right += 1;
                riter = hash_num.find(right + 1);
            }
            
            max_len = max(max_len, right - left + 1);
        }
        
        return max_len;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值