给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
题目看着很简单,但要求O(n)时间复杂度,这就得好好想想,因为相当于只能遍历一遍数组,可以想想什么数据结构可以帮到我们,基本威力巨大的数据结构有Set和Map这两种,HashSet插入有O(1)的复杂度,很不错。
虽然想到用Set,但是粗略一想不知道具体怎么实现,第一眼答案觉得它怎么会满足O(n)的时间复杂度呢?仔细想想,确实只需要遍历一遍数组里的元素就可以了,重点在!set.contains(num-1)
,只有满足这个条件才会进入第二层循环。
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) set.add(num);
int maxLen = 0;
for (int num : nums){
if (!set.contains(num-1)){
int curNum = num;
int curLen = 1;
while (set.contains(curNum+1)){
curNum++;
curLen++;
}
maxLen = Math.max(maxLen, curLen);
}
}
return maxLen;
}