力扣128题:最长连续序列
题目描述
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
输入输出样例
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9
算法一,使用动态规划,时间复杂度O(nlogn)
int longestConsecutive(vector<int>&nums)
{
//首先对数组进行排序
if(nums.empty())
{
return 0;
}
sort(nums.begin(),nums.end());
int maxLength=0;
int length=nums.size();
//使用动态规划,初始化值为1
vector<int>dp(nums.size(),1);
for(int i=1;i<length;i++)
{
if(nums[i]==nums[i-1]+1)
{
dp[i]=dp[i-1]+1;
}
if(nums[i]==nums[i-1])
{
dp[i]=dp[i-1];
}
}
return *max_element(dp.begin(),dp.end());
}
算法2,使用hash表存储,时间复杂度为O(n)
//使用hash来存储数据,使得时间复杂度压缩到O(n)
int longestConsecutive2(vector<int>&nums)
{
unordered_set<int>numSets;
//将数据保存到hash表中
for(auto num:nums)
{
numSets.insert(num);
}
int maxLength=0;
//对hash表进行遍历
for(auto num:numSets)
{
//如果num-1的值在hash表中不存在,则设置长度为1
if(!numSets.count(num-1))
{
int currNum=num;
int currLength=1;
//查找当前值的下一个num+1是否存在
while(numSets.count(currNum+1))
{
currNum+=1;
currLength+=1;
}
maxLength=max(maxLength,currLength);
}
}
return maxLength;
}