Leetcode128. 最长连续序列
题目描述
/**
* 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
*
* 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
*
*/
思路分析
- 计算一个数组中连续数字的最长序列长度,可以使用优化思路
- 先将数组元素去重,使用Hash结构,具体为Set集合
- 然后遍历去重后的数组,对于当前数字,判断集合中是否存在它的前一个数字,即比它小1的数组,如果存在,则连续序列不应该从当前数子开始,应从前边的数字开始,重复其步骤,直到当前数字是当前序列的第一个数
- 然后使用内层循环计算以当前第一个数字开始的序列长度
- 记录集合中所有的序列长度,然后取最大值返回
- 源码见下
源码及分析
/**
* @param nums 整数数组
* @return 返回最长连续长度
*/
public int longestConsecutive(int[] nums) {
//使用HASH将数组元素去重
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
//定义变量保存最大长度
int longest = 0;
//遍历去重后的集合中元素
for (Integer item : set) {
//加条件确保当前数字是当前序列的第一个数字,如果不是则不进入循环
if (!set.contains(item - 1)) {
//记录第一个数字
int current_num = item;
// 初始化当前开始序列的长度为1
int current_length = 1;
//使用循环判断当前连续序列组成的数字总共有几个并记录大小
while (set.contains(current_num + 1)) {
current_num += 1;
current_length += 1;
}
//使得longest记录长度最大的序列长度
longest = Math.max(longest, current_length);
}
}
return longest;
}