题目
给定一个未排序的整数数组 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
- 方法一:哈希
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;//数组去重,存储所有数字
int n = nums.size();
int len=0;//储存最长连续序列长度
//构建哈希表
for(int i=0 ; i<n; ++i)
num_set.insert(nums[i]);
//在哈希表中对每一个元素查找它两侧的元素,直到为空
while(!num_set.empty()){
int now = *num_set.begin();//取当前的首元素开始查找
num_set.erase(now);//删除该元素
int left = now-1, right = now+1;//分别向两侧查找
//查找左侧元素
while(num_set.find(left)!=num_set.end()){
num_set.erase(left);
--left;
}
++left;
//查找右侧元素
while(num_set.find(right)!=num_set.end()){
num_set.erase(right);
++right;
}
--right;
//更新len长度
len = max(len, right-left+1);
}
return len;
}
};
- 时间复杂度O(n)
- 空间复杂度O(n)
- 思路
- 用unordered_sort()去重,存储所有数字。
- 对一个元素,删掉该元素,查找是否有它数值减一和数值加一的元素,如果找到则删除该元素继续向两侧找。
- 比较该长度与len的值,如果大于则更新,返回len