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
    
  • 相关阅读:
    filterFilter用法
    angular.copy()克隆数据
    angularjs中是否选择所有和$filter过滤orderBy排序
    qt5.5 qtcreator中文乱码
    shared_ptr
    Thrift-0.9.2编译安装
    一行代码获取通讯录联系框架
    IOS枚举使用
    Static Cell-静态TableView
    NavigationController的使用整理
  • 原文地址:https://www.cnblogs.com/enmac/p/13056670.html
Copyright © 2011-2022 走看看