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; } };