题目描述:
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
题解:
初始版本:【时间复杂度超出】
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<int> s;
if(nums.size()==0) return 0;
s.push_back(nums[0]);
for(int i=1;i<nums.size();i++){
if(nums[i]!=s.back()){
s.push_back(nums[i]);
}
}
if(s.size()==1) return 1;
int ans=0;
int l=0;
for(int r=1;r<s.size();r++){
if(s[r]-s[r-1]!=1){
l=r;
}
ans=max(ans,r-l+1);
}
return ans;
}
};
解题思路:
先将原数组排序,再除去其中相同元素,然后遍历一遍数组,记录连续序列的长度。
出错点:排序算法的时间复杂度为O(NlogN),超出要求时间复杂度,所以不能使用排序算法。
正确题解:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> s(nums.begin(),nums.end());
int ans=0;
for(int x:s){
if(s.contains(x-1)){
continue;
}
int y=x+1;
while(s.contains(y)){
y++;
}
ans=max(ans,y-x);
}
return ans;
}
};
解题思路:
利用set除去数组中重复元素,对于每一个元素,找到比它小且相邻的最小开始元素,紧接着找最大且存在连续序列的元素。并在每次循环中维护最大连续序列长度。
学习点:
set容器的用法:
std::set 是 C++ 标准库中的一种关联容器,用于存储唯一元素,并自动按升序排序。它基于红黑树实现,支持高效的查找、插入和删除操作。
set容器的contains函数用法:
contains
成员函数,用于检查集合中是否包含某个元素。contains
函数的用法非常简单,它接受一个参数(即要查找的元素),并返回一个 bool
值,表示该元素是否存在于集合中。