【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
posted @ 2020-06-06 21:56  macguz  阅读(188)  评论(0编辑  收藏  举报