题目链接
最长连续序列
题目描述
注意点
- 0 <= nums.length <= 100000
- 不要求序列元素在原数组中连续
解答思路
- 要想实现时间复杂度为 O(n) 的算法解决此问题,关键是数字不能多次遍历,所以首先要对数组进行去重;然后为什么防止某个元素已经在某个序列中进行计算后进行二次计算,需要控制寻找最长连续序列时只从小往大找(或从大往小找),本题采用从小往大找,也就是对于任一元素num,如果num - 1在数组中,则跳过,如果num - 1不在数组中,则往右侧寻找其最长连续序列
代码
class Solution {
public int longestConsecutive(int[] nums) {
int res = 0;
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
for (int num : set) {
if (set.contains(num - 1)) {
continue;
}
int currNum = num;
int currMax = 1;
while (set.contains(currNum + 1)) {
currNum++;
currMax++;
}
res = Math.max(res, currMax);
}
return res;
}
}
关键点
- 防止寻找最长连续序列的过程中任一元素被多次访问