128. 最长连续序列
1、题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
- 并查集
- 数组
- 哈希表
2、题目分析
一批数据按连续性分成了多段,查找最长分段的长度。
(使用分段处理的思路,遇到段头再开始处理,其他元素直接返回。这里的关键是:判断某元素是否为所在段的段头)
注:如何判断某元素是否为所在分段开头位置:判断该元素-1的数是否存在于哈希表,若不存在,则该元素是所在分段开头位置
将数据都存在哈希表中,
遍历数组,只要遇到该元素是所在分段的开头位置,则遍历该段的长度。
若该元素不是所在分段的开头位置,则忽略。
3、复杂度最优解代码示例
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
// 标记元素是否存在
set.add(num);
}
int maxLength = 0;
for (int num : set) {
if (set.contains(num - 1)) {
// 当前元素非段头元素,不处理
continue;
}
// 遇到段头元素,开始遍历所在段,并记录段长
int length = 1;
while (set.contains(num + length)) {
length++;
}
maxLength = Math.max(maxLength, length);
}
return maxLength;
}
4、适用场景
最长连续序列(Longest Consecutive Sequence)是一种常见的算法问题,主要用于解决一些与数字序列相关的问题。以下是一些适用场景:
-
面试题和编程挑战:在许多技术面试中,最长连续序列问题常常被用作考察应聘者编程能力和解决问题思路的题目。
-
内存管理:在某些操作系统或数据库管理系统中,可能需要找到一组连续的空闲内存块来满足特定的需求。
-
调度算法:在生产调度、任务分配等场景中,可能需要找到一组连续的任务或资源以满足某些约束条件。
-
数据压缩:在无损压缩算法中,通过寻找重复出现的模式并记录其位置,可以有效地压缩数据。
-
股票交易策略:在股票市场分析中,可能会用到最长连续上涨或下跌的股票序列作为交易信号。
-
网络安全:在入侵检测系统中,可以通过分析网络流量中的连续事件来识别异常行为。
-
时间线分析:在历史数据分析或项目管理中,可能需要找到一系列连续的时间点或事件。
-
物流和供应链管理:在货物追踪、库存管理等方面,可能需要找到一系列连续的物品或订单。
-
生物信息学:在基因测序或蛋白质结构分析中,可能会用到最长连续的DNA序列或氨基酸序列。
-
游戏开发:在某些类型的游戏中,可能需要生成或分析一系列的连续事件或状态。