DEV Community

Nic
Nic

Posted on • Originally published at coderscat.com on

2

LeetCode: Longest Consecutive Sequence

Challenge description

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

Your algorithm should run in O(n) complexity.

Example:

Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.
Enter fullscreen mode Exit fullscreen mode

Naive Solution: Use set to check consecutive elements

We use a set to check whether one element exists in array. Iterate all the elements and try to find the longest sub-array in the loop.

But the overall time complexity is O(N^2), which will time-limited.

class Solution {
public:

  set<int> S;

  int longestConsecutive(vector<int>& nums) {
    for(auto i: nums)
      S.insert(i);

    int ans = 0;
    for(auto i: S){
      int n = i + 1;
      int cnt = 1;
      while(S.count(n)) {
        cnt++;
        n++;
      }
      ans = max(ans, cnt);
    }

    return ans;
  }
};

Enter fullscreen mode Exit fullscreen mode

An Optimization on the previous solution: reduce duplicated checking

The duplicated checking happened at a long consecutive array, suppose we have 3, 4, 5, 6, 7.

First, we checked with 3, and then checked at 4, and 5 …

This could be avoided if we test whether i-1 has been checked.

class Solution {
public:
  set<int> S;

  int longestConsecutive(vector<int>& nums) {
    for(auto i: nums)
      S.insert(i);

    int ans = 0;
    for(auto i: S){
      if(!S.count(i-1)) {
        int n = i;
        int cnt = 1;
        while(S.count(n+1)) {
          cnt++;
          n++;
        }
        ans = max(ans, cnt);
      }
    }
    return ans;
  }
};

Enter fullscreen mode Exit fullscreen mode

Use union-find to store relationships of elements

union-find is an elegant data structure to store and query consecutive relationships. U will store the next larger elements of one element.

Iterate with all the elements, try to find the largest element from one starting point, and the distance of two elements will be the number of consecutive elements.

class Solution {
public:
  map<int,int> U;

  int find(int x){
    return U.count(x) ? U[x] = find(U[x]) : x;
  }

  int longestConsecutive(vector<int>& nums) {
    for(auto i: nums)
      U[i] = i+1;

    int ans = 0;
    for(auto i: nums){
      int y = find(i+1);
      ans = max(ans, y-i);
    }
    return ans;
  }
};

Enter fullscreen mode Exit fullscreen mode

The post LeetCode: Longest Consecutive Sequence appeared first on Coder's Cat.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay