128. 最长连续序列

发布时间 2023-09-05 17:18:30作者: timeMachine331

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

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

示例 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

序列不是子串,子串要求连续,而子序列要求不改变相对位置即可,本题只要求元素的值连续,而不要求下标连续。

如果对它尝试排序复杂度是多少

 用set?set内置排序,也是排序。那就unordered_set,向左向右分别find ++

 

伪代码:

扫描添加到unorder set里

for num in set:

  while(num++ exist) count++;

  while(num-- exist) count++;

扫描了很多重复元素,有没有办法单向扫描,避免重复,找出其中最大的,或者最小的?

 

本身是一段一段的存在,只扫一个方向的话,就是靠跳过哪些某个方向包含在set中的元素

举例,往大的方向扫,那么就要求执行的这个位置的数是它所在的连续区间里最小的,如果还有比它小1(一定得是1)的存在,那就直接跳过,只扫那些比它大的。扫到不存在为止

 

要点:

1.unset怎么构造的,使用了nums的迭代器。

2.unset的查询某个元素是否存在的策略可以用find,返回迭代器和end进行比较,或者是使用count查询存在的个数,这在当每个元素只会出现一次时是一样的

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> unset(nums.begin(), nums.end());

        int historyMax = 0;
        for (auto& num : unset){
            int count = 1;
            if(unset.count(num-1) == 0){
                int s = num;
                while(unset.count(++s) == 1) count++;
                historyMax = max(historyMax, count);
            }
        }
        return historyMax;
    }
};