128. Longest Consecutive Sequence
来源:互联网 发布:知乎书店推荐 编辑:程序博客网 时间:2024/06/04 18:00
题意: 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),你要找连续的子序列时间复杂度怎么样都要O(n^2)的吧,后来看了discuss才知道。。。原来是利用了一些简单的数据结构,比如python中从set和dict中查找某个元素所需要的时间复杂度是O(1),因为它们都是hash的结构,而在list中才需要O(n),于是就有了下面两种方法,方法一:
class Solution: def longestConsecutive(self, nums): nums = set(nums) best = 0 for n in nums: if n - 1 not in nums: m = n + 1 while m in nums: m += 1 best = max(best, m - n) return best
这个方法比较容易看懂,里面的if n-1 not in nums这句成功降低了时间复杂度,但是我一直有一个疑问,python的set函数为什么会把一个未排序好的数组转为成一个排序好的元组,如果真是这样的话,set函数的时间复杂度就不是作者所说的O(n)了,而应该是O(nlogn)。
方法二:
class Solution: # @param num, a list of integer # @return an integer def longestConsecutive(self, num): result, lengths = 1, {key: 0 for key in num} for i in num: if lengths[i] == 0: lengths[i] = 1 left, right = lengths.get(i - 1, 0), lengths.get(i + 1, 0) length = 1 + left + right result, lengths[i - left], lengths[i + right] = max(result, length), length, length return result
这个方法没有说明歧义,但是略微复杂了一点,构建一个键值为数字本身,值为已搜索到的子序列差长度的dict,left和right分别为当前子序列的左右边界,最后再更新边界的长度。
0 0
- 128.Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- 128. Longest Consecutive Sequence
- MyEclipse关于查看Jar引入问题
- websocket
- ES6中的常用语法总结
- 分享一个链接
- 使用android studio JNI报错 undefined reference to '__android_log_print'
- 128. Longest Consecutive Sequence
- 一句话与中国菜刀的用法
- Android图像常用压缩技术 详细讲解啊
- python连oracle
- 安卓实战项目之制作简单的计时器
- win10 远程桌面连接设置
- BlockingQueue定时或达到一定条数读取队列
- gitlab如何实现代码分支管理(只有思路没有解决方案)
- (POJ2676)Sudoku <简单数独问题>