LintCode-最长连续序列

本文介绍了一种寻找未排序整数数组中最长连续序列的方法,采用unordered_map优化算法,实现O(n)的时间复杂度。通过合并左右序列并更新序列长度的方式,高效解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最长连续序列

描述
给定一个未排序的整数数组,找出最长连续序列的长度。

说明
要求你的算法复杂度为O(n)

样例
给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4],返回所求长度 4

一开始用的map,改成unordered_map之后会快10%左右

class Solution {
public:
    /**
     * @param nums: A list of integers
     * @return an integer
     */
    int longestConsecutive(vector<int> &num) {
        // write you code here
        unordered_map<int,int> len;
        int max=0;
        for(auto i:num)
        {
            if(len[i]==0)//避免重复元素
            {
                int l=len[i-1],r=len[i+1];
                len[i]=l+r+1;
                len[i+r]=l+r+1;
                len[i-l]=l+r+1;
                max=max>len[i]?max:len[i];
            }
        }
        return max;
    }
};

放了一个多月回来一看竟然没看懂,看来思路还是要多写下来。
题目要求取最长连续序列,意思是求数字是连着的序列,不是上升子序列什么的。
做法:若数字i左右存在临近序列,则合并i-1,i,i+1分别所在序列,由于只求长度,则只需要记录当前数字i所在序列的长度作为map的value,合并后只需更新合并后序列的最左和最右端的value。
当数字i左右一端或者两端都没有临近序列时,由于len[i-1]和len[i+1]都为0,所以可以直接往上加,省去判断过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值