LeetCode解题 128:Longest Consecutive Sequence
Problem 128: Longest Consecutive Sequence [Hard]
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.
Example 1:
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.
来源:LeetCode
解题思路
使用Hash表进行存储和查找。对于每个数字分别向左和向右扩展至最大长度,并更新maxLen。
具体思路:
- 首先将nums用Hash表存储。
- 遍历Hash表内元素,如果已经访问过则不再访问(说明该元素所在序列的长度已知)。
- 对于每个元素,分别向左和向右扩展,直到扩展的数不在nums内,计算连续长度并更新maxLen。
- 将当前元素和扩展到的元素都加入访问列表visited中。
减少执行用时的设计:
- 使用visited存储已经访问过的元素,防止重复访问。
- 在
N - visited.size() <= maxLen
时退出遍历,因为剩下未访问过的元素长度不可能再超过当前的maxLen。
因为Hash表中查找元素只需要 O ( 1 ) O(1) O(1)时间,每个元素只访问一次,因此时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)。
运行结果:
要点:哈希表
Solution (Java)
class Solution {
public int longestConsecutive(int[] nums) {
int N = nums.length;
if(N < 2) return N;
Set<Integer> elements = new HashSet<Integer>(Arrays.stream(nums).boxed().collect(Collectors.toList()));
Set<Integer> visited = new HashSet<Integer>();
int maxLen = 0;
for(Integer num : elements){
if(N - visited.size() <= maxLen) break;
if(visited.contains(num)) continue;
visited.add(num);
int len = 1;
int offset = 1;
while(elements.contains(num - offset)){
visited.add(num - offset);
offset++;
}
len += offset - 1;
offset = 1;
while(elements.contains(num + offset)){
visited.add(num + offset);
offset++;
}
len += offset - 1;
maxLen = Math.max(maxLen, len);
}
return maxLen;
}
}