思路:
- 创建一个hash列表,nums_set;
- 通过外层循环依次遍历nums_set,找出连续序列中最小的那个数才开始内层循环,避免重复计算连续序列的长度,如7、8、9,8、9,z找到7之后再计算连续序列长度;
- 用math.max()函数更新最长序列长度。
例子:
如列表[10,9,15,8,7,20,6]:
当遍历到10时,有比10小1的数9,所以跳过运算,直接遍历下一个数字9,
在nums_set中又存在比9小1的8,又跳过后面的运算,遍历下一个数15,nums_set并不存在14,所以currentStreak=1,但不存在16,
所以用longestStreak=max(currentStreak,longestStreak)暂时得到“最长的序列值”。然后将外层循环num遍历到8,nums_set中存在7,所以跳过(也就是不将currentStreak赋值)
遍历到7,nums_set中又存在6,继续跳过,外层循环num遍历到20,nums_set中没有19,所以currentStreak=1,但不存在21,所以继续用longestStreak=max(currentStreak,longestStreak) 暂时得到“最长的序列值,最后外层循环num遍历到6,nums_set中存在7,8,9,10,所以通过内层循环四次currentStreak +=1,最后得currentStreak=5,用max函数与上一个longestStreak比较,得到新的
longestStreak = 5
代码:
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> nums_set = new HashSet<Integer>(); //创建一个hash列表,nums_set
// 去除重复的元素
for(int num : nums){
nums_set.add(num);
}
int longestStreak = 0; // 初始化最长连续序列的长度值为0
//遍历nums_set进行逐个比较
for(int num : nums_set){
longestStreak = 0;
if(!nums_set.contains(num-1)){
int currentNum = num; //可以不用创建新变量currentNum,直接使用num
int currentStreak = 1;
while(nums_set.contains(currentNum+1)){ //currentNum可以换成num
currentNum +=1; //currentNum可以换成num
currentStreak +=1;
}
// 更新最长连续序列的长度
longestStreak = Math.max(currentStreak,longestStreak);
}
}
return longestStreak;
}
}