1 minute read

<-M 128> Longest Consecutive Sequence

// Method 1
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        int len = nums.size();
        if(len < 1)
            return 0;
        set<int> data;
        for(auto n: nums) {
            data.insert(n);
        }
        bool isFirst = true;
        int prev, count = 0;
        int res = 1;
        for(int num : data) {
            if(isFirst) {
                prev = num;
                count++;
                isFirst = false;
            }
            else if(prev + 1 == num) {
                count++;
                prev = num;
                if(res < count)
                    res = count;
            }
            else {
                count = 1;
                prev = num;
            }
        }
        return res;
    }
};

// Method 2
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int count = 1;
        int ans = 1;

        if(nums.empty())
            return 0;

        for(int i = 1; i < nums.size(); i++) {
            if(nums[i] == nums[i - 1])
                continue;

            if(nums[i] - nums[i-1]==1) {
                count++;
                if(count > ans)
                    ans = count;
            }
            else {
                count=1;
            }
        }
        return ans;
    }
};

// Method 3
class Solution {
public:
    int longestConsecutive(vector<int>& num) {
        unordered_map<int, int> map;
        int size = num.size();
        int l = 1;
        for(int i = 0; i < size; i++) {
            if (map.find(num[i]) != map.end())
                continue;
            map[num[i]] = 1;
            if (map.find(num[i] - 1) != map.end()) {
                l = max(l, mergeCluster(map, num[i] - 1, num[i]));
            }
            if (map.find(num[i] + 1) != map.end()) {
                l = max(l, mergeCluster(map, num[i], num[i] + 1));
            }
        }
        return size == 0 ? 0 : l;
    }
private:
    int mergeCluster(unordered_map<int, int> &map, int left, int right) {
        int upper = right + map[right] - 1;
        int lower = left - map[left] + 1;
        int length = upper - lower + 1;
        map[upper] = length;
        map[lower] = length;
        return length;
    }
};