前言
作者:晓宜
个人简介:互联网大厂Java准入职,阿里云专家博主,csdn后端优质创作者,算法爱好者,github忠实用户
今天给大家分享下hot100中的一题,最长连续序列,希望可以帮助到你
Problem: 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
思路
我们考虑一种直接的解法,我们可以先把整个列表去重,然后排序,之后遍历处理后的列表中的每一个元素;如果前后相隔为1的话就加到我们临时设计的长度,保存最长的临时长度
bash
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
if nums == []:
return 0
nums = sorted(list(set(nums)) )
n = len(nums)
ans = 0
cnt = 1
for i in range(1,n):
if nums[i] == nums[i-1]+1:
cnt+=1
else:
ans = max(ans,cnt)
cnt = 1
ans = max(ans,cnt)
return ans
但是题目要求我们要时间复杂度 O ( n ) O(n) O(n),我们考虑另一种解法,对于去重的元素x,如果x-1不在去重后的集合中,说明他是一个增长链的起点,我们只需要计算这个链条的长度即可,最终保存最长的那一条上升链,那就是我们要找的答案。
复杂度
时间复杂度:
遍历一次 O ( n ) O(n) O(n)
空间复杂度:
集合保存了列表的点 O ( n ) O(n) O(n)
code
Python3
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
longest_streak = 0
num_set = set(nums)
for num in num_set:
if num - 1 not in num_set:
current_num = num
current_streak = 1
while current_num + 1 in num_set:
current_num += 1
current_streak += 1
longest_streak = max(longest_streak, current_streak)
return longest_streak