严格来说这道题算是诈胡吧,而且理论上来说难度也没达到hard,直接上题目吧:
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
Your algorithm should run in O(n) complexity.
Example:
Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.大概意思就是给一个没有排序的序列,让你从中找到一个最长的连续序列,连续的意思就是自然数那样的,后一个比前一个大1就行了,然后输出这个长度。O(n)的复杂度。
本来我只是想试一试而已,因为快排的复杂度是O(nlogn)的,是不满足复杂度O(n)的,但是抱着试一试的心态我还是写了一个暴力的方法。先排一下序,然后从第一个数开始遍历,如果后一个比前一个数大1,就表示满足连续的条件,在答案ans上加1,如果不满足就表明这个序列断掉了,保存这个长度,然后找下一个连续序列,知道遍历完,再输出这个最大的长度即可。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
sort(nums.begin(),nums.end());//排序
if(nums.size()==0)//长度为0时直接输出0,要不然会产生数组越界的错误
return 0;
else if(nums.size()==1)//长度为1时直接输出1,不然也会产生数组越界
return 1;
int ans=0;int temp=1;//ans用于记录最大长度,也是我们最后输出的值。temp记录当前连续序列的长度
for(int i=0;i<nums.size()-1;i++)
{
if(nums[i+1]-nums[i]==1)//满足连续的条件
{
temp++;
}
else if(nums[i+1]-nums[i]==0)//相同的值我们直接忽略,继续执行,不能因为值相同就说明连续终止,因为相同值不影响我们取最长的序列
{
temp+=0;
}
else//表明连续终止,判断temp是否大于ans
{
if(temp>ans)
ans=temp;
temp=1;
}
if(i==nums.size()-2)//遍历结束,一定要加上,不然序列到最后到满足连续条件的话最后一个子段时不会终止的
{
if(temp>ans)
ans=temp;
temp=1;
}
}
return ans;
}
};这道题不知道出题者时想考察什么,虽然复杂度超了,但是好像时间上还超过了98%的人,有点难以理解。

探讨了寻找未排序整数数组中最长连续元素序列的问题,并提供了一种排序后遍历的解决方案,尽管时间复杂度略高,但实践效果良好。

190

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



