leetcode 128. 最长连续序列
问题描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
代码
首先给一个时间复杂度\(O(nlog(n))\)不符合题意的做法:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int n = nums.size();
if(n<=1)return n;
sort(nums.begin(),nums.end());
int i = 1,curlen = 1,ans = 1;
while(i < n)
{
curlen = 1;
while(i < n &&(nums[i] == nums[i-1]+1 || nums[i] == nums[i-1]))
{
if(nums[i] == nums[i-1]+1)
{
++curlen;
}
++i;
}
++i;
ans = max(ans,curlen);
}
return ans;
}
};
结果
执行用时 :12 ms, 在所有 C++ 提交中击败了94.10%的用户
内存消耗 :10 MB, 在所有 C++ 提交中击败了66.67%的用户
代码2
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()<=1)return nums.size();
unordered_set<int> st(nums.begin(),nums.end());//去重
int ans = 1,small,large,curlen;
for(int val:nums)
{
if(!st.count(val))continue;
st.erase(val);
small = val - 1,large = val + 1;
curlen = 1;
while(st.count(small)){
st.erase(small--);
++curlen;
}
while(st.count(large)){
st.erase(large++);
++curlen;
}
ans = max(curlen,ans);
}
return ans;
}
};
结果:
执行用时 :24 ms, 在所有 C++ 提交中击败了44.24%的用户
内存消耗 :10.7 MB, 在所有 C++ 提交中击败了6.67%的用户
代码3
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()<=1)return nums.size();
unordered_set<int> st(nums.begin(),nums.end());//去重
int ans = 0,curlen;
for(int val:st)
{
//测试用例含极端例子,如果存在比val小的数,那么连续的数列肯定不是从val开始
if(val!= INT_MIN && st.count(val-1))continue;
curlen = 1;
while(val != INT_MAX && st.count(++val))
{
++curlen;
}
ans = max(ans,curlen);
}
return ans;
}
};
结果:
执行用时 :24 ms, 在所有 C++ 提交中击败了44.24%的用户
内存消耗 :10.8 MB, 在所有 C++ 提交中击败了6.67%的用户