题目大意
https://leetcode.com/problems/flatten-binary-tree-to-linked-list/
给你一个无序的数组,找出其中的一个序列(不要求按照原数组的顺序),序列满足连续(类似1,2,3,4,5…..),问序列的最大长度。要求时间复杂度是O(n)
题目分析
这道题可以利用并查集做,遍历数组,将每个数n和n-1归为一组,最后对出现次数进行统计计算。但是并查集每次操作的复杂度是Ackerman函数的反函数,此反函数在算法复杂度分析时,可以近似视为常数,所以总复杂度O(n)。
还有一种简单的思路,思路参考这里:https://discuss.leetcode.com/topic/6148/my-really-simple-java-o-n-solution-accepted,map.get(i)
含义就是以中间包含i元素的最大的序列长度,那么每次在数组中遇到一个数字n,就获取map.get(n-1)
和map.get(n+1)
,根据这这两个值更新n
处的值,但也要更新n-left
和n+right
值。
代码
并查集
|
|
第二种简单方法
|
|
时间复杂度:O(n)