最长连续序列
给定一个未排序的整数数组 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 <= 10e5
-10e9 <= nums[i] <= 10e9
这道题一开始没想出来,朝着hashmap怎么样一次性以o(n)复杂度直接做出来的方向走了(误入歧途了啊!!!甚至在考虑每个数连续个数能不能广播给左右邻居...)
但是这道题目其实就是考虑每个元素x怎么找下一个连续的数字,比如x找x+1,一直往后找,记录一下连续了多少次而已;但是如果只是简单的循环遍历的话那就与普通的for循环没有区别了,用hashmap最大的好处就是不增长时间复杂度(乘法的那种),所以hashmap可以起到及时止损的作用,举个栗子就好理解了,按照普通的方法要去for一遍看看x+1存不存在,hashmap只需要in一下;
例如, 1,2,3,4,5,6,7,8
1->2>3>4>5>6>7>8 =====>hashmap[1] = 8(连续次数)
而此时,又进入下一次循环了,2>3>4>5>6>7>8 =====>hashmap[2] = 7(连续次数),而此时这里是不需要的,因为1在2前面,2------>8的过程是多余的,就需要及时止损,而止损方式就是通过hashmap看看x-1是否存在,因为如果存在的话,不需要计算这遍循环了(如果x-1在前面遍历过了,那么已经算出来了;如果x-1在后面,那么后面会算到的!嘻嘻)
与前面两道题不一样,这道题是在拓展hashmap的辅助功能,长见识了
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
hashmap = {10000000000000:0}
# 防止 空 的情况
for i in nums:
if i not in hashmap:
hashmap[i]=1
for i in hashmap:
temp_cmp = i
if i-1 in hashmap:
continue
while True:
if temp_cmp+1 in hashmap:
hashmap[i]+=1
temp_cmp+=1
else:
break
return max(e for e in hashmap.values())