leetcode128. 最长连续序列

该博客介绍了如何使用哈希表和排序策略解决LeetCode上的128题,即在未排序整数数组中找到最长的连续序列的长度。文章提供了详细解题思路和算法实现,旨在帮助读者理解如何在O(n)的时间复杂度内解决此类问题。

原题链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/

题意:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

方法:哈希表+排序

bool cmp(pair<int,int> a,pair<int,int> b)
{
    return a.first<b.first;//按键值对的第一个元素,升序排序
}
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if(nums.size()==0) return 0;
        if(nums.size()==1) return 1;
        unordered_map<int,int> mp;//哈希表<数字,出现的次数>
        vector<pair<int,int>> v;//向量存键值对,用来排序
        for(auto &num:nums)
        {
            mp[num]++;
        }
        for(auto iter=mp.begin();iter!=mp.end();iter++)
        {
            v.push_back(*iter);//放到向量中
        }
        sort(v.begin(),v.end(),cmp);//利用sort对向量进行排序
        auto iter = v.begin();//迭代器存放当前元素
        auto pre = iter;//pre存放迭代器前一个元素
        iter++;
        int cnt=1;
        int max=1;
        while(iter!=v.end())//判断是否是连续的一段,是的话就继续cnt自加,否则cnt置为1,每次更新都要与max进行比较
        {
            if(iter->first-pre->first==1)//判断是否连续
                cnt++;
            else //不连续就重置
                cnt = 1;
            if(cnt>max) max = cnt;//更新
            pre = iter;//记录前一个迭代器
            iter++;
        }
        return max;//返回最大长度
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值