【012】LeetCode128最长连续序列

题目128 最长连续序列

额外的收获:

写代码时尽量避免 for(int i = 0; i < nums.size(); ++i) { } ,在运行中会消耗大量的时间,应该使用 for (auto num : nums) 这种形式的!

12.1 官方解析

点击这里

下面的解法跟官方解析差不多!经过测试,无论自己写的解法还是官方解析,执行用时都是挺落后的,在所有 C++ 提交中击败了不到 20%的用户。

实在是惨不忍睹啊!

12.2 解法1

这个解法是LeetCode 101 中的解法,思路很清晰

把所有的数字放到一个哈希表中,然后不断地从哈希表中任取一值并删除它、在它之前、之后的所有连续数字,并更新目前最长连续序列长度!最终可以找到最长连续序列。

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> hash;
        // 将所有元素存入哈希表中
        for (const int num : nums) {
            hash.insert(num);
        }
        // 最长连续序列长度
        int result = 0;
        // 直到哈希表为空,即所有的元素都已查找
        while (!hash.empty()) {
            int cur = *(hash.begin());
            hash.erase(cur);
            int next = cur + 1, prev = cur - 1;

            while (hash.count(next)) {
                hash.erase(next++);
            }
            while (hash.count(prev)) {
                hash.erase(prev--);
            }
            result = max(result, next - prev - 1);
        }
        return result;
    }
};

12.2 解法2

同样是使用哈希表来解决,不过这里是先找到数组中最小的元素,然后从一遍开始查找。

来看代码:

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> hash;
        for (const int num : nums) {
            hash.insert(num);
        }
        int result = 0;
        for (const int value : hash) {
            // 这样就找到了所有元素的最小值,从小到大开始遍历查找
            if (!hash.count(value - 1)) {
                int cur = value;
                while (hash.count(++cur));

                result = max(result, cur - value);
            }
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ClimberCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值