128. 最长连续序列( 数组背诵题吧)

 

难度中等

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

 

提示:

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

 

假设我们有一个数组[0,3,7,2,5,8,4,6,0,1]
我们先通过肉眼知道了其最长的序列为[0,1,2,3,4,5,6,7,8]
在这个序列中,如果我们从 1 开始,往下寻找最长序列,可得[1,2,3,4,5,6,7,8]
如果我们从 2 开始,往下寻找最长序列,可得[2,3,4,5,6,7,8]
明显可以看出,两个序列是会重复的,我们的计算也会重复
这么样才能不重复呢,我们从 这个序列的最小元素也就是序列起点 开始,
往下寻找能接在这个元素后面的其他元素,就会得到该序列的最长长度

 

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        n_set = set(nums)
        res = 0
        for i in range(len(nums)):
            cur = nums[i]
            cnt = 1
            if cur+1 in n_set:
                continue
            while cur-1 in n_set:
                cur = cur-1
                cnt+=1
            res  =  max(res,cnt)
        return res

 

 

 

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> n_set;
        for(int a: nums) {
            n_set.emplace(a);
        }
        int res = 0;
        for(int a : n_set) {
            // 包含a-1,以a 为起点肯定不是最长答案
            if (n_set.count(a-1)) {
                continue;
            }
            int cur = a;
            while(n_set.count(cur+1)) {
                cur++;
            }
            res = max(res,cur-a+1);
        }
        return res;
    }
};

 

posted @ 2022-05-18 00:31  乐乐章  阅读(42)  评论(0编辑  收藏  举报