最长连续序列(leetcode)

难度:中等

题目描述

给定一个未排序的整数数组 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

思路

这道题可以用暴力法解决,先对数组中所有元素进行排序,之后使用双层循环求出答案。但题目要求时间复杂度为O(n)且数组元素可能有重复,因此不能使用暴力解法。

想要去重第一个想到的肯定就是哈希表,使用哈希表哦构建一个新数组,并把原数组所有元素插入到新数组中,哈希表会自动去掉重复元素。之后最重要的就是判断前驱元素,即要找到的连续数组的第一个元素,假设a是第一个元素,那么数组中肯定没有a-1这个数(否则连续数组的第一个元素就是a-1了)。这里判断是否有a-1的方法就是使用new_nums.count(x),该代码是C++中unordered_set的一个操作,用于检查集合中是否存在值为x的元素,因为unordered_set数组中是不允许出现重复元素的,因此返回值只能是1或者0,可以用来判断元素是否存在。之后就是简单的记录每个连续数组的长度,返回长度最大值即可。

代码

class Solution {
public:
    int longestConsecutive(vector& nums) {
        unordered_set new_nums;
        for(const int& num:nums) new_nums.insert(num);
        int max_length=0;
        for(const int& num:new_nums){
            if(!new_nums.count(num-1)){
                int now_num=num;
                int length=1;
                while(new_nums.count(now_num+1)){
                    now_num=now_num+1;
                    length++;
                }
                max_length=max(max_length,length);
            }
        }
        return max_length;
    }
};

复杂度

  • 时间复杂度:O(n)。

  • 空间复杂度:O(n)。

你可能感兴趣的:(leetcode,算法,数据结构,c++)