Sonic生成的谈判对手用于商务培训模拟演练
2026/1/2 20:24:26
给定一个未排序的整数数组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
示例 3:
输入:nums = [1,0,1,2]输出:3
提示:
0 <= nums.length <= 105-109 <= nums[i] <= 109#第一步:去重 nums_set=set(nums)nums_set = set(nums)nums转换为集合(set),利用集合「元素唯一性」的特性,自动剔除列表中的重复整数,避免重复元素对后续连续序列判断造成干扰(比如若列表有重复的2,去重后仅保留一个,不影响连续序列长度计算)。#第二步:重新排序(从小到大) nums_set_sort=sorted(nums_set)nums_set_sort = sorted(nums_set)sorted()函数对去重后的集合进行升序排序,得到一个有序的列表。只有将元素按从小到大排列,才能方便后续依次判断相邻元素是否为连续整数(即后一个元素是否等于前一个元素 + 1)。#第三步:计数 max_count = 1 now_count=1#考虑到有多组连续数,需要比较大小 if len(nums_set_sort)==0: print(0) else: now=nums_set_sort[0] for i in range(1,len(nums_set_sort)): if nums_set_sort[i]==now+1:# 代表连续 now_count+=1 now=nums_set_sort[i] else: if(now_count>=max_count): max_count=now_count now_count=1#重置 now=nums_set_sort[i] if (now_count >= max_count):#确保max_count(如果给的是连续的12345,那么到5的时候,now_count=5,max_count=1,没有机会走上面的那个else分支) max_count = now_count print(max_count)max_count、now_count)完成统计。max_count(记录全局最长长度,初始为 1,因为至少有 1 个元素)、now_count(记录当前连续序列长度,初始为 1)、now(记录当前基准元素,初始为有序列表第一个元素);now_count加 1,并更新基准元素;若不连续,就用当前计数更新全局最长计数,再重置当前计数和基准元素;now_count >= max_count的判断,避免出现「列表末尾是最长连续序列」(无法进入else分支更新max_count)的情况,保证统计结果准确。class Solution: def longestConsecutive(self, nums: List[int]) -> int: #第一步:去重 nums_set=set(nums) #第二步:重新排序(从小到大) nums_set_sort=sorted(nums_set) #第三步:计数 max_count = 1 now_count=1#考虑到有多组连续数,需要比较大小 if len(nums_set_sort)==0: return 0 else: now=nums_set_sort[0] for i in range(1,len(nums_set_sort)): if nums_set_sort[i]==now+1:# 代表连续 now_count+=1 now=nums_set_sort[i] else: if(now_count>=max_count): max_count=now_count now_count=1#重置 now=nums_set_sort[i] if (now_count >= max_count):#确保max_count(如果给的是连续的12345,那么到5的时候,now_count=5,max_count=1,没有机会走上面的那个else分支) max_count = now_count return max_countnums = [100,4,200,1,3,2] #第一步:去重 nums_set=set(nums) #第二步:重新排序(从小到大) nums_set_sort=sorted(nums_set) #第三步:计数 max_count = 1 now_count=1#考虑到有多组连续数,需要比较大小 if len(nums_set_sort)==0: print(0) else: now=nums_set_sort[0] for i in range(1,len(nums_set_sort)): if nums_set_sort[i]==now+1:# 代表连续 now_count+=1 now=nums_set_sort[i] else: if(now_count>=max_count): max_count=now_count now_count=1#重置 now=nums_set_sort[i] if (now_count >= max_count):#确保max_count(如果给的是连续的12345,那么到5的时候,now_count=5,max_count=1,没有机会走上面的那个else分支) max_count = now_count print(max_count)