题目LeetCode128
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
Python解法
代码示例(哈希表)
from typing import List
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
# 1. 把数组转成集合,去重+快速查找
s = set(nums)
# 2. 记录最长连续序列的长度
max_len = 0
# 3. 遍历集合中每一个数字
for x in s:
# 4. 核心判断:如果当前数字的前一个数不在集合中 → 它是连续序列的起点
if x – 1 not in s:
cur = x # 当前遍历的起点数字
cnt = 0 # 统计当前连续序列的长度
# 5. 向后遍历,统计连续数字的个数
while cur in s:
cur += 1
cnt += 1
# 6. 更新最长长度
max_len = max(max_len, cnt)
return max_len
过程演示

用示例数据 [100,4,200,1,3,2] 的执行步骤图

核心逻辑

Java解法
代码示例(哈希表)
class Solution{
public int longestConsecutive(int[] nums){
Set<Integer> set = new HashSet<>();
for(int num: nums){
set.add(num);
}
int max_len = 0;
for(int x: set){
if(!set.contains(x – 1)){
int cur = x;
int cnt = 0;
while(set.contains(cur)){
cur += 1;
cnt += 1;
}
max_len = Math.max(max_len, cnt);
}
}
return max_len;
}
}
C++解法
代码示例(哈希表)
class Solution{
public:
int longestConsecutive(vector<int>& nums){
unordered_set<int> st(nums.begin(), nums.end());
int max_len = 0;
for(int x: st){
if (st.find(x – 1) == st.end()) {
int cur = x;
int cnt = 0;
while (st.count(cur)) {
cur++;
cnt++;
}
ma_len = max(max_len, cnt);
}
}
return max_len;
}
};

