【LeetCode每日一题】2020.6.6 128. 最长连续序列
作者:互联网
128. 最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
分析:
如果是有序数组,只需要遍历一次相邻的元素就可以得出最长连续序列的长度了。但是排序需要O(nlgn)。
现在考虑暴力法:对于数组中的每一个元素x,我们查找x-n, ..., x-1, x, x+1, ..., x+n是否存在。这种做法时间复杂度非常高。但是我们先考虑如何去查找元素,暴力的做法是遍历数组,但是我们可以使用HashSet来存储数组,达到线性时间查找。
接着我们可以发现:我们不需要遍历一个元素的两边,因为如果存在一个最长子序列。从该子序列的最小元素x开始遍历,只需要遍历在该元素右边的元素(x+1, x+2, ..., x+n)就可以得到答案。当然,如果选择从元素左边开始遍历也可以得到同样的效果。
进一步可以思考如何进行遍历。由于题目限制O(n)的时间复杂度。因此我们只可以遍历整个数组一次,并且每次遍历进行的操作必须是线性时间复杂度的操作。
代码(Python):
class Solution:
def longestConsecutive(self, nums):
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
标签:streak,遍历,2020.6,元素,current,序列,num,128,LeetCode 来源: https://www.cnblogs.com/enmac/p/13056670.html