给定一个未排序的整数数组 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
示例 3:
输入: nums = [1,0,1,2]
输出: 3
方法一: set
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.empty()) return 0; // 边界:空数组直接返回0
set<int> s(nums.begin(), nums.end());
int max_count = 1;
int count = 1;
auto it = s.begin();
int prev = *it; // 保存前一个元素
++it; // 从第二个元素开始遍历
while (it != s.end()) {
int curr = *it;
if (curr == prev + 1) { // 当前元素是前一个+1,连续
count++;
max_count = max(max_count, count);
} else { // 不连续,重置计数
count = 1;
}
prev = curr; // 更新前一个元素
++it; // 迭代器正常步进
}
return max_count;
}
};
方法二:哈希
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()) return 0;
unordered_set<int> s(nums.begin(),nums.end());
int max_count=1;
for(int num:s){
// 只有num是连续序列的起点(num-1不存在),才开始计数
if(s.find(num-1) == s.end()){
int cur = num;
int cur_count=1;
while(s.find(cur+1) !=s.end()){
cur++;
cur_count++;
}
max_count = max(max_count,cur_count);
}
}
return max_count;
}
};
两种解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 优势 |
|---|---|---|---|
| 基础版(set) | O(nlogn) | O(n) | 逻辑简单,易理解 |
| 最优版(哈希表) | O(n) | O(n) | 时间效率更高,面试推荐 |