zoukankan      html  css  js  c++  java
  • 【LeetCode每天一题】Longest Consecutive Sequence(最长的连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

    Your algorithm should run in O(n) complexity.

    Example:

    Input: [100, 4, 200, 1, 3, 2]
    Output: 4
    Explanation: The longest consecutive elements sequence is [1,2,3,4] 
    Therefore its length is 4.


    思路

      这道题求列表中的最长连续序列,因为是列表无序的,因此我们最简单的方法就是先将列表排序,然后从头到尾进行遍历查找。找出最长子序列。这种算法的时间复杂度为O(nlogn),空间复杂度为O(1)。还有另外一种方法就是我们利用python中集合的特性,先将列表转化成集合除去其中重复的元素,然后从头开始进行遍历离查找。这种解法的时间复杂度为O(n),(为什么会是n?因为我想起了一个复杂度分析中的均摊法,在操作的过程中大部分操作都是O(1),只有一个是O(n2),所以均摊下来的话就是O(n)。)
    解决代码

    第一种解法
     1 class Solution(object):
     2     def longestConsecutive(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         if not nums or len(nums) == 1:    # 异常情况,直接返回
     8             return 0 if not nums else 1
     9         nums.sort()           # 先排序
    10         # nums = list(set(nums))
    11         max_leng = 0       # 结果变量
    12         cur_leng = 1       # 记录当前的长度
    13         for i in range(1, len(nums)):     # 从头开始遍历。
    14             if nums[i] == nums[i-1]:      # 重复的直接遍历下一个
    15                 continue
    16             if nums[i] == nums[i-1]+1:    #  判断前一个和当前的这个是否是连续
    17                 cur_leng += 1
    18             else:                         # 记录结果
    19                 max_leng = max(max_leng, cur_leng)     
    20                 cur_leng = 1
    21         return max(max_leng, cur_leng)     # 返回当前的结果
    第二种解法
     1 class Solution(object):
     2     def longestConsecutive(self, nums):
     3         """
     4         :type nums: List[int]
     5         :rtype: int
     6         """
     7         if not nums or len(nums) == 1:
     8             return 0 if not nums else 1        
     9         nums_set = set(nums)      # 转化为集合,去除重复的元素
    10         max_leng = 0
    11         for i in nums_set:    
    12             if i-1 not in nums_set:   # 判断该当前元素减一,是否在集合中。 如果不存在的话,那就从当前元素进行查找,找到以当前元素开始最长的序列.
    13                 cur_nums = i
    14                 cur_leng = 1
    15                 while cur_nums +1 in nums_set:   
    16                     cur_nums += 1
    17                     cur_leng += 1
    18                 max_leng = max(max_leng, cur_leng)  # 得到当前元素最长的连续序列
    19         return max_leng         # 返回结果
  • 相关阅读:
    react-动画
    react-json渲染
    SQL 只取重复记录一条记录并且是最小值
    SQL 函数:树结构指定父节点遍历所有的子节点
    EasyUI treegrid 删除一条或多条记录
    String.Format数字格式化输出 {0:N2} {0:D2} {0:C2} (转)
    EasyUI 左,右(上、下)布局
    DataTable 树形构造加全部
    easyui datagrid 格式化列显示两位小数、千分位
    c# 判断文件是否已使用
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10919765.html
Copyright © 2011-2022 走看看