Start learning free

LESSON 265 OF 410 · HASH TABLE

Longest Consecutive Sequence II in Java (O(n) Time Complexity)

Practice O(n) Read the full explanation

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

Example 1:

Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: Longest consecutive sequence is [1, 2, 3, 4].
             Therefore its length is 4.

Example 2:

Input: [0, 2, 0, 1, 2, 3, 1]
Output: 4
Explanation: Longest consecutive sequence is [0, 1, 2, 3].
             Therefore its length is 4.
	     Note that we count each value once, even though values 0, 1 and 2 appear 2 times each in nums

Note:

Your algorithm should run in O(n) time and use O(n) extra space.


STEP 1 OF 8
    Ctrl + Enter to check

    JAVA · HASH TABLE

    Longest Consecutive Sequence in Java, explained

    Problem Definition

    The problem requires finding the length of the longest consecutive elements sequence in an unsorted array of integers. The solution should run in O(n) time complexity and use O(n) extra space.

    Input:

    • An unsorted array of integers.

    Output:

    • An integer representing the length of the longest consecutive elements sequence.

    Constraints:

    • The algorithm should run in O(n) time complexity.
    • The algorithm should use O(n) extra space.

    Example:

    Input: [100, 4, 200, 1, 3, 2]
    Output: 4
    Explanation: Longest consecutive sequence is [1, 2, 3, 4]. Therefore its length is 4.

    Understanding the Problem

    The core challenge is to identify the longest sequence of consecutive integers in an unsorted array. This problem is significant in various applications such as data analysis, where identifying sequences or trends is crucial. A common pitfall is to sort the array first, which would not meet the O(n) time complexity requirement.

    Approach

    To solve this problem efficiently, we can use a HashSet to achieve O(n) time complexity. Here’s a step-by-step approach:

    Naive Solution:

    A naive solution would involve sorting the array and then finding the longest consecutive sequence. However, sorting takes O(n log n) time, which is not optimal for this problem.

    Optimized Solution:

    We can use a HashSet to store the elements of the array. Then, for each element, we check if it is the start of a sequence (i.e., the previous element is not in the set). If it is, we count the length of the sequence starting from that element.

    Thought Process:

    • Insert all elements into a HashSet.
    • Iterate through the array, and for each element, check if it is the start of a sequence.
    • If it is, count the length of the sequence.
    • Keep track of the maximum length found.

    Algorithm

    Here is a step-by-step breakdown of the algorithm:

    1. Create a HashSet and add all elements of the array to it.
    2. Initialize a variable to keep track of the maximum sequence length.
    3. Iterate through the array. For each element, check if it is the start of a sequence by checking if the previous element is not in the HashSet.
    4. If it is the start, count the length of the sequence by checking consecutive elements in the HashSet.
    5. Update the maximum sequence length if the current sequence is longer.

    Code Implementation

    import java.util.HashSet;
    
    public class LongestConsecutiveSequence {
        public int longestConsecutive(int[] nums) {
            // Create a HashSet to store the elements
            HashSet<Integer> numSet = new HashSet<>();
            for (int num : nums) {
                numSet.add(num);
            }
    
            int longestStreak = 0;
    
            // Iterate through the array
            for (int num : nums) {
                // Check if it is the start of a sequence
                if (!numSet.contains(num - 1)) {
                    int currentNum = num;
                    int currentStreak = 1;
    
                    // Count the length of the sequence
                    while (numSet.contains(currentNum + 1)) {
                        currentNum += 1;
                        currentStreak += 1;
                    }
    
                    // Update the maximum sequence length
                    longestStreak = Math.max(longestStreak, currentStreak);
                }
            }
    
            return longestStreak;
        }
    
        public static void main(String[] args) {
            LongestConsecutiveSequence solution = new LongestConsecutiveSequence();
            int[] nums1 = {100, 4, 200, 1, 3, 2};
            int[] nums2 = {0, 2, 0, 1, 2, 3, 1};
            System.out.println("Longest consecutive sequence length (Example 1): " + solution.longestConsecutive(nums1)); // Output: 4
            System.out.println("Longest consecutive sequence length (Example 2): " + solution.longestConsecutive(nums2)); // Output: 4
        }
    }
    

    Complexity Analysis

    The time complexity of this approach is O(n) because we iterate through the array and perform constant-time operations for each element. The space complexity is also O(n) due to the HashSet used to store the elements.

    Edge Cases

    Potential edge cases include:

    • An empty array: The output should be 0.
    • An array with one element: The output should be 1.
    • Arrays with duplicate elements: The algorithm should handle duplicates correctly.

    Examples:

    Input: []
    Output: 0
    
    Input: [1]
    Output: 1
    
    Input: [1, 2, 2, 3]
    Output: 3

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases with small arrays.
    • Edge cases such as empty arrays and arrays with one element.
    • Arrays with duplicate elements.
    • Large arrays to test performance.

    Example test cases:

    Input: [100, 4, 200, 1, 3, 2]
    Output: 4
    
    Input: [0, 2, 0, 1, 2, 3, 1]
    Output: 4
    
    Input: []
    Output: 0
    
    Input: [1]
    Output: 1
    
    Input: [1, 2, 2, 3]
    Output: 3

    Thinking and Problem-Solving Tips

    When approaching such problems, consider the following tips:

    • Understand the problem requirements and constraints thoroughly.
    • Think about different approaches and their time and space complexities.
    • Use data structures like HashSet to achieve optimal solutions.
    • Practice solving similar problems to improve problem-solving skills.

    Conclusion

    In this blog post, we discussed how to find the length of the longest consecutive sequence in an unsorted array of integers. We explored a HashSet-based approach that achieves O(n) time complexity and O(n) space complexity. Understanding and solving such problems is crucial for improving problem-solving skills and preparing for coding interviews.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free