leetcode 128. 最长连续序列

问题描述

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

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

示例:

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

代码

首先给一个时间复杂度\(O(nlog(n))\)不符合题意的做法:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int n = nums.size();
        if(n<=1)return n;
        sort(nums.begin(),nums.end());
        int i = 1,curlen = 1,ans = 1;
        while(i < n)
        {
            curlen = 1;
            while(i < n &&(nums[i] == nums[i-1]+1 || nums[i] == nums[i-1]))
            {
                if(nums[i] == nums[i-1]+1)
                {
                    ++curlen;
                }
                ++i;
            }
            ++i;
            ans = max(ans,curlen);
        }
        return ans;
    }
};

结果

执行用时 :12 ms, 在所有 C++ 提交中击败了94.10%的用户
内存消耗 :10 MB, 在所有 C++ 提交中击败了66.67%的用户

代码2

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()<=1)return nums.size();
        unordered_set<int> st(nums.begin(),nums.end());//去重
        int ans = 1,small,large,curlen;
        for(int val:nums)
        {
            if(!st.count(val))continue;
            st.erase(val);
            small = val - 1,large = val + 1;
            curlen = 1;
            while(st.count(small)){
                st.erase(small--);
                ++curlen;
            }
            while(st.count(large)){
                st.erase(large++);
                ++curlen;
            }
            ans = max(curlen,ans);
        }
        return ans;
    }
};

结果:

执行用时 :24 ms, 在所有 C++ 提交中击败了44.24%的用户
内存消耗 :10.7 MB, 在所有 C++ 提交中击败了6.67%的用户

代码3

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()<=1)return nums.size();
        unordered_set<int> st(nums.begin(),nums.end());//去重
        int ans = 0,curlen;
        for(int val:st)
        {
            //测试用例含极端例子,如果存在比val小的数,那么连续的数列肯定不是从val开始
            if(val!= INT_MIN && st.count(val-1))continue;
            curlen = 1;
            while(val != INT_MAX && st.count(++val))
            {
                ++curlen;
            }         
            ans = max(ans,curlen);
        }
        return ans;
    }
};

结果:

执行用时 :24 ms, 在所有 C++ 提交中击败了44.24%的用户
内存消耗 :10.8 MB, 在所有 C++ 提交中击败了6.67%的用户
posted @ 2020-06-05 14:58  曲径通霄  阅读(142)  评论(0编辑  收藏  举报