题目大意:
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
解题思路:
我们每次枚举数字的第一个,然后往后数有多少个。可以证明每个数字只会被枚举一次。注意,中间用hash。
class Solution {
public:
unordered_set<int> ms;
int longestConsecutive(vector<int>& nums) {
int ans = 0;
for(auto it:nums)ms.insert(it);
for(auto it:ms){
if(!ms.count(it-1)){
int no = it;
int len = 1;
while(ms.count(no))no++,len++;
ans = max(ans,len-1);
}
}
return ans;
}
};
第二种方法是排序+递推
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0)return 0;
int ans = 1;
sort(nums.begin(),nums.end());
vector<int> dp(nums.size(),0);
dp[0] = 1;
int n = nums.size();
for(int i =1;i<n;i++){
if(nums[i] == nums[i-1]+1)dp[i] = dp[i-1]+1;
else if(nums[i] == nums[i-1])dp[i] = dp[i-1];
else dp[i] = 1;
ans = max(ans,dp[i]);
}
return ans;
}
};

本文介绍了解决最长连续序列问题的两种高效算法。第一种利用哈希集合实现O(n)时间复杂度,通过枚举每个数字作为序列的起始点,查找后续连续元素。第二种采用排序加递推的方法,适用于已排序或易于排序的输入。文章详细解析了每种算法的实现过程和关键代码。
409

被折叠的 条评论
为什么被折叠?



