题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
思路:找出一个数x,不断判断其x+1是否存在,存在则长度加1,当这样外层循环遍历加上内层循环遍历,时间复杂度会达到o(n^2)。
所以我们可以在遍历的时候判断x-1是否存在数组中,如果存在我们就不需要遍历数组了,直接跳过,防止重复遍历。
class Solution {
public int longestConsecutive(int[] nums) {
//首先对数组去重
Set<Integer> num_set = new HashSet<>();
for(int i = 0; i < nums.length; i++){
num_set.add(nums[i]);
}
//初始化最长长度
int longestStreak = 0;
//遍历去重后的数组
for(int num : num_set){
//如果集合中包含 x - 1则跳过
if(!num_set.contains(num - 1)){
//记录当前数
int currentNum = num;
//当前长度为1
int currentStreak = 1;
//如果数组中包含x + 1不断循环
while(num_set.contains(currentNum + 1)){
//当前数不断加1,不断查找x+1是否存在
currentNum += 1;
//存在x+1,则将当前长度加1
currentStreak +=1;
}
longestStreak = Math.max(longestStreak,currentStreak);
}
}
return longestStreak;
}
}