加载中...
剑指 Offer II 119-最长连续序列
发表于:2021-12-03 | 分类: 中等
字数统计: 706 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/WhsWhI

中文题目

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

 

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

 

提示:

  • 0 <= nums.length <= 104
  • -109 <= nums[i] <= 109

 

进阶:可以设计并实现时间复杂度为 O(n) 的解决方案吗?

 

注意:本题与主站 128 题相同: https://leetcode-cn.com/problems/longest-consecutive-sequence/

通过代码

高赞题解

我总结了剑指Offer专项训练的所有题目类型,并给出了刷题建议和所有题解。

在github上开源了,不来看看吗?顺道一提:还有C++、数据结构与算法、计算机网络、操作系统、数据库的秋招知识总结,求求star了,这对我真的很重要?

$\Rightarrow$通关剑2

排序 时间复杂度O(nlogn)

119.jpg
思想就很质朴,但是肯定是过不了面试的

int longestConsecutive(vector<int>& nums) {
    size_t len = nums.size();
    if(len == 0) return 0;
    sort(nums.begin(), nums.end());
    int inclen = 1, ans = 1;
    
    for(int i = 1; i < len; i++) {
        if (nums[i] == nums[i - 1] + 1) inclen++;
        else if (nums[i] == nums[i - 1]) continue;
        else inclen = 1;
        ans = max(ans, inclen);
    }
    return ans;
}

时间复杂度为 O(n)

用hash存起来,遍历的时候找后面如果有找找找,然后更新最大长度,但是这样还不如排序

360 ms 30.2 MB

代码

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> s;
        for(const int& num : nums) {
            s.insert(num);
        }
        int ans = 0;
        for(int& num : nums) {
            if(s.find(num - 1) != s.end())
                continue;
            int cnt = 1;        
            while(s.find(num + 1) != s.end()) {
                cnt++;
                num++;
            }
            ans = max(ans, cnt);        
        }
        return ans;
    }
};

优化

执行用时:48 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:30.2 MB, 在所有 C++ 提交中击败了100.00%的用户

上面拉夸的原因是做了很多重复的计算,比如

1,2,3,4,5,6

每个都要往后看到6,太蠢了

因此,我们选择看过就删除,过河拆桥

int longestConsecutive(vector<int>& nums) {
        unordered_set<int> s;
        for (int i = 0; i < nums.size(); i++) {
            s.insert(nums[i]);
        }
        int ans = 0;
        while (!s.empty()) {
            int now = *s.begin();
            s.erase(now);
            int l = now - 1, r = now + 1;
            while (s.find(l) != s.end()) {
                s.erase(l);
                l--;
            }
            while(s.find(r) != s.end()) {
                s.erase(r);
                r++;
            }
            l = l + 1, r = r - 1;
            ans = max(ans, r - l + 1);
        }
        return ans;

    }

统计信息

通过次数 提交次数 AC比率
4264 8900 47.9%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
剑指 Offer II 057-值和下标之差都在给定的范围内
下一篇:
剑指 Offer II 058-日程表
本文目录
本文目录