c++最长连续序列leetcode

需要用到map,map和unordered_map都用于存储键值对,但是map有个天然优势就是map的key值是有序的,即若为map<int,int> counts;

分别插入数据4:1,2:3,1:2

map插入的几种方式:

counts[2] =1;

counts[4] =3;

counts.insert(pair<int,int>(1,2));

遍历counts输出键值,结果为:1,2,4

而unordered_map的键值则是无序的,与插入顺序有关;

因此本题可用map,遍历nums,依次将nums的元素作为counts的key值,之后只要遍历count的key(已有序),若当前key比前一个key大1,则意味着当前key和前一个key为连续序列

class Solution {
public:

    int longestConsecutive(vector<int>& nums) {
        int result = 1;
        if(nums.size()<=1) return nums.size();
        map<int,int> counts;//使用map计算
        //map大小动态增加,且map内数据都是有序的,key有序
        for(int i=0;i<nums.size();i++){
            counts[nums[i]]++;
        }
        //遍历map,计算最大连续序列;
        int pre_num = counts.begin()->first;
        int cur_count=1;
        //遍历map的key,若当前key比前一个key大1,则当前key和前一个key有序
        for(auto iter=counts.begin();iter!=counts.end();iter++){
            if(iter->first-pre_num==1){
                cur_count++;
            }else{
                cur_count=1;
            }
            pre_num = iter->first;
            result = max(result,cur_count);
        }
        return result;
    }
};

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值