128. 最长连续序列
思路
-
将所有元素放入一个
HashSet中,用于快速查找是否存在某个数字。 -
遍历每个数字时,判断它是否是一个序列的起点:
- 如果
num - 1不存在于集合中,则说明num是一个潜在序列的起点。
- 如果
-
从该起点开始向后扩展,统计当前连续序列的长度。
-
维护最大长度即可。
复杂度分析
- 时间复杂度:O(n)
每个元素最多被访问两次(一次在哈希集合遍历中,一次在序列扩展中),整体为线性时间。 - 空间复杂度:O(n)
哈希集合存储了所有元素,占用额外空间。
代码
import java.util.*;
public class LongestConsecutiveSequence {
public int longestConsecutive(int[] nums) {
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int longest = 0;
for (int num : numSet) {
// 只处理作为连续序列起点的数字
// 不包含num - 1,则说明不是起点,不需要统计连续长度
if (!numSet.contains(num - 1)) {
int currentNum = num;
int currentLength = 1;
// 向后扩展
while (numSet.contains(currentNum + 1)) {
currentNum++;
currentLength++;
}
// 更新最长长度
longest = Math.max(longest, currentLength);
}
}
return longest;
}
}

浙公网安备 33010602011771号