[LeetCode] Longest Consecutive Sequence | O(n)找最长连续序列

https://leetcode.com/problems/longest-consecutive-sequence/

这个问题做到O(n)还是需要动一番脑筋。注意:不是找最长递增子序列。

思路:注意到每个元素必属于一个连续递增序列,而且不会出现重复,有点并查集的感觉。所以我们只要找到每个元素所属的连续序列,取最长的即可。由于有的元素属于同一个连续序列,考察完一个连续序列后把其中所有的元素删除可以避免重复考察。

算法:先把数组中所有元素放到一个Hash Set中,然后遍历数组每个元素,考察该元素所在的最长连续序列(看比该元素小和大的元素是否也在set中,即连续减1/加1能延伸到多远,考察一个就删除一个),记录最长的序列长度即可。

在hash set中,每个元素都被插入和删除一次,平摊复杂度是O(n)。

class Solution {
public:
    int longestConsecutive(vector<int> &nums) {
        if (nums.empty()) return 0;
        unordered_set<int> myset(nums.begin(), nums.end());
        int ret = 1;
        for (auto num : nums) {
            if (myset.empty()) break;
            if (myset.count(num) == 0) continue;
            int len = 1;
            // lower
            int lower = num - 1;
            while (myset.count(lower) == 1) {
                myset.erase(lower);
                len++; lower--;
            }
            // higher
            int higher = num + 1;
            while (myset.count(higher) == 1) {
                myset.erase(higher);
                len++; higher++;
            }
            myset.erase(num);
            ret = max(ret, len);
        }
        return ret;
    }
};
原文地址:https://www.cnblogs.com/ilovezyg/p/7011244.html