哈希集合
class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();for (int num : nums) {set.add(num);}int ans = 0;for (int num : set) {int cur = num;if (!set.contains(cur - 1)) {while (set.contains(cur + 1)) {cur ++;}}ans = Math.max(ans, cur - num + 1);}return ans;}
}
代码分析:
-
数据结构选择:
- 使用
HashSet
(set
)来存储数组nums
中的所有元素。HashSet
提供了O(1)的平均时间复杂度来检查一个元素是否存在,这对于后续寻找连续序列非常关键。
- 使用
-
去重:
- 在将数组元素添加到
HashSet
的过程中,自动去除了所有重复的元素。这对于找到最长连续序列没有影响,因为连续序列是由不同的数字组成的。
- 在将数组元素添加到
-
初始化答案:
- 初始化变量
ans
为0,用于存储最长连续序列的长度。
- 初始化变量
-
遍历HashSet:
- 遍历
set
中的每个元素。由于set
中不包含重复元素,所以每个元素只会被处理一次。
- 遍历
-
检查连续序列的起点:
- 对于每个元素
num
,检查num - 1
是否存在于set
中。如果不存在,说明num
可能是一个连续序列的起点。
- 对于每个元素
-
寻找连续序列的终点:
- 如果
num
是一个连续序列的起点,代码通过while
循环来寻找这个序列的终点。循环条件是set.contains(cur + 1)
,即检查cur + 1
是否存在于set
中。循环会一直进行,直到找到一个数字,其下一个数字不在set
中为止。
- 如果
-
更新最长序列长度:
- 在
while
循环结束后,计算当前连续序列的长度(cur - num + 1
),并与当前记录的最长序列长度ans
进行比较,更新ans
。
- 在
-
返回结果:
- 遍历完
set
中的所有元素后,返回最长连续序列的长度ans
。
- 遍历完
这个算法的关键在于利用HashSet
的O(1)查找时间复杂度来避免了对数组的多次遍历。它只遍历了set
两次:一次是填充set
,另一次是寻找最长连续序列。因此,总的时间复杂度是O(n),其中n是数组nums
的长度。
综上所述,该算法是有效的,并且满足了题目要求的时间复杂度。它充分利用了HashSet
的特性来优化查找过程,从而实现了高效的解决方案。
注意:这是最基本的解法,必须掌握!!