码迷,mamicode.com
首页 > 其他好文 > 详细

Longest Consecutive Sequence

时间:2017-11-10 00:30:55      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:复杂   tco   哈希   tps   blog   pre   工作   turn   algorithm   

  Nov, 9, 2017.
  https://leetcode.com/problemset/algorithms/?topicSlugs=union-find%2Clinked-list
  Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
  For example,
  Given [100, 4, 200, 1, 3, 2],
  The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.
  Your algorithm should run in O(n) complexity.

  建立字典,依次读入整数,每次在边界处记录长度变化,为防止重复计算,整数必须被读入字典。

  复杂度为O(N),以下是submission。

 1 class Solution:
 2     def longestConsecutive(self, nums):
 3         length = {}
 4         ans = 0
 5         for i in nums:
 6             if i not in length:
 7                 l = length[i - 1] if i - 1 in length else 0
 8                 r = length[i + 1] if i + 1 in length else 0
 9                 length[i] = length[i - l] = length[i + r] = l + r + 1
10                 ans = max(ans, length[i])
11         return ans

  解法二,数组->哈希表,寻找连续序列起始数(x-1 not in nums),直接查找这个序列的长度。

  有趣的地方在于,我们是在哈希表里查询一个确定的数,使得这个操作的复杂度被压进了O(1)。因此这个算法的复杂度还是O(N)。

  以下是StefanPochmann的submission。

 1 def longestConsecutive(self, nums):
 2     nums = set(nums)
 3     best = 0
 4     for x in nums:
 5         if x - 1 not in nums:
 6             y = x + 1
 7             while y in nums:
 8                 y += 1
 9             best = max(best, y - x)
10     return best

  其实两种方法都利用了哈希表查询的便利性。我原来想把输入看作森林,用并查集来完成工作。这种算法不好实现,也不见得简单。

 

Longest Consecutive Sequence

标签:复杂   tco   哈希   tps   blog   pre   工作   turn   algorithm   

原文地址:http://www.cnblogs.com/neopolitan/p/7811762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!