128. Longest Consecutive Sequence

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

严格来说这道题算是诈胡吧,而且理论上来说难度也没达到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%的人,有点难以理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值