leetcode128. Longest Consecutive Sequence

题目:题目链接

思路:最长连续序列,不会。下面介绍一种大神的解法和官方解答。

方法一 大神解法

利用map的有序性,把元素都丢到map里面,然后直接遍历一遍map就可以了。看代码:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if (nums.size() < 2) return nums.size();
        map<int, int>mp;
        int cnt = 1;
        int ans = 1;
        for (const auto& num : nums)
            mp[num]++;
        for (const auto& ele : mp) {
            if (mp[ele.first - 1] != 0) cnt++;//是连续的
            else {
                ans = max(ans, cnt);
                cnt = 1;
            }
        }
        return max(ans, cnt);//可能没有访问for中的else
    }
};

其实这个复杂度是O(nlogn)的,因为map的插入是O(logn)。不过代码还是很好理解的,和排序后处理的方式差不多。

方法二 官方解答

先丢到set里面,把重复的元素去掉,这一步map也是同样的效果。然后遍历set,对于每一个可能的序列,我们都从最开始的元素访问,也就是说对于一个x1,x2,x3…xn的序列,我们不会访问x2,x3,因为只有从x1开始才是最长的,所以对于一个数x,只有x-1不存在时才从他开始寻找最长序列。看代码吧:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int>num_set;
        int longest_streak = 0;
        for (const auto& num : nums)
            num_set.insert(num);
        for (const auto& num : num_set) {
            if (num_set.count(num - 1) == 0) {//当num-1不存在时,表面num是一个序列的开头
                int current_num = num;//记录当前num
                int current_streak = 1;//当前长度
                while (num_set.count(current_num + 1)) {//从num开始找连续的一个序列
                    current_num++;
                    current_streak++;
                }
                longest_streak = max(longest_streak, current_streak);//保留最长的
            }
        }
        return longest_streak;
    }
};

现在刷100题真的是一题都不会,太菜了。只能看看题解,不是做题是学题啊。
加油加油加油加油!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值