题目:最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
分析
找到一组数的集合,我们想一下可能有的方法,动态规划?貌似没有状态转移方程可以写;滑动窗口?他不是连续的子数组。
首先依然是暴力:遍历每个数,找到每个数的时候,再遍历数组看看有没有下个数,然后再遍历,再看看有没有下个数,三次循环就可以得到以每个数为起点的最长字段。ok我们发现,复杂度是O(n^3)。这是不可接受的。然后我们来进行优化。
我们在查找每个数的下继,例如得到2 ,那我们就要看看有没有3。这种情况能不能进行优化?答案是可以的,用哈希表。我们把每个数当成key值放进哈希表,然后只要直接查询该数是否存在即可。哈希表的查询复杂度是O(1)所以这里就降低成为了O(n^2)。显然还不够,我们继续优化。
我们会发现,如果存在2,3,4,5这个集合,那么我们会轮流都去以2,3,4,5为最小值去寻找最长字符串。例如一个数组是[2,3,4,5]。第一次在下标0得到2,然后继续寻找直到得到2,3,4,5.然后第二次来到下标1得到3,我们会继续去寻