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 tho values 0, 1 and 2 appear 2 times each in nums
Your algorithm should run in O(n) time and use O(n) extra space.
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: [100, 4, 200, 1, 3, 2] Output: 4 Explanation: Longest consecutive sequence is [1, 2, 3, 4]. Therefore its length is 4.
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.
To solve this problem efficiently, we can use a HashSet to achieve O(n) time complexity. Here’s a step-by-step approach:
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.
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.
Here is a step-by-step breakdown of the algorithm:
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
}
}
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.
Potential edge cases include:
Examples:
Input: [] Output: 0 Input: [1] Output: 1 Input: [1, 2, 2, 3] Output: 3
To test the solution comprehensively, consider the following test cases:
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
When approaching such problems, consider the following tips:
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.
For further reading and practice, consider the following resources: