zoukankan      html  css  js  c++  java
  • 【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
    
  • 相关阅读:
    关于 setColorFilter 和 PorterDuff.Mode
    下拉刷新 SwipRefreshLayout
    from athletelist import AthleteList出现红色下滑波浪线警告
    IndentationError: unindent does not match any outer indentation level
    定制数据对象2
    定制数据对象
    数据处理02
    数据处理
    python 工具箱
    嵌套列表的格式打印
  • 原文地址:https://www.cnblogs.com/enmac/p/13056670.html
Copyright © 2011-2022 走看看