LeetCode.最长连续序列(哈希表)

题目描述:来自LeetCode

 思路:可能第一想法是排序,反正我是,但是排序,快排的时间复杂度是O(NlongN)的,题目要求用O(N)时间复杂度,所以只能是遍历一边数组求解。遍历数组的时候,如果连续序列是从这个数开始的,说明说明呢?说明这个数的前一个数不存在!那么我们就要把这个数当做这个序列的第一个数,看这个数+1是否存在,+2是否存在...不存在了我们就更新最大值。那连续序列不是以这个数开始的条件是什么呢?那这个数-1的数一定存在,这样连续最长序列一定是从这个数-1的数开始的,所以这样就不用求这个数开始的连续序列,我们直接遍历下一个数就行。问题是怎么判断这个数-1或者+1的数是否存在呢?哈希表!因为哈希表不仅可以用来判断是否存在还可以去重!连续序列一定不包含重复元素,在开始的时候,我们就把每一个数都放进hash集合就行了。

代码实现C++:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()<=1) return nums.size();
        unordered_set<int> set;
        for(int num:nums){//将元素存入hash表
            set.insert(num);
        }
        int longestCon=0;//用来更新每一次求的序列长度的最大值
        for(int num:nums){
            if(!set.count(num-1)){//如果这个数-1的数不存在,那就说明这个数就是某个序列的起始
                int currentNum=num;
                int currentLength=1;//用来更新当前序列的最大长度
                while(set.count(currentNum+1)){
                    currentNum+=1;//当下一个连续的数存在,我们就更该当前要求的数
                    currentLength+=1;//更新长度
                }
                longestCon=max(longestCon,currentLength);//更新每一次求的序列的最大值
            }
        }
        return longestCon;
    }
};

今日刷题任务完成,如有错误,欢迎指正~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值