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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.代码如下:
class Solution {
public:
//思路一:哈希表
/*
*如果是暴力遍历,每遍历一个元素,就都去寻找是否有n-2,n-1,n+1,n+2..存在;
*事实上对于一个连续的序列,只需要遍历一次就可以出结果,所以我们要过滤掉重复步骤
*每一个连续序列,只有当我们遍历到这个序列的首、尾部时才遍历序列;如果遍历到这个序列的中间元素则不扩展
*/
int longestConsecutive(vector<int>& nums) {
unordered_set<int> temp;
if(nums.size()==0){
return 0;
}
//把元素放入map
for(const auto& x:nums){
temp.insert(x);
}
int maxL=1;
int length=1;
for(const auto& x:temp){
length=1;
//count时间复杂度logn
if(!temp.count(x-1)){
int s=x;
while(temp.count(s+1)){
length++;
s++;
}
maxL=max(maxL,length);
}
}
return maxL;
}
};