题目描述:
给定一个未排序的整数数组,找出最长连续序列的长度。
示例1:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长的连续序列是 [1, 2, 3, 4]。其长度为 4。
示例2:
输入: [0,3,7,2,5,8,4,6,0,1]
输出: 9
解题思路:
方法一:排序
将数组排序,然后在排序后的数组中找到最长连续序列。时间复杂度:O(NlogN),空间复杂度为:O(1)(取决于排序实现)
方法二:哈希表
使用哈希表存储每个端点值对应连续区间的长度,若数已在哈希表中出现过,则跳过不处理。若是新数加入:
- 取出其左右相邻数已有的连续区间长度 left 和 right
- 计算当前数的区间长度为:cur_length = left + right + 1
- 根据 cur_length 更新最长连续区间长度 max_length 的值
- 更新区间两端点的长度值
时间复杂度:O(N),空间复杂度为: O(N)
代码实现(使用哈希表):
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
int max = 0;
for (int num : nums) {
// num之前已经访问过了,假设序列为[a,b],
// 这里访问过a,那么在后面的循环中就可以跳过这个序列
if (set.contains(num-1)) {
continue;
}
int cur = num;
int curMax = 1;
while (set.contains(cur+1)) {
cur++;
curMax++;
}
max = Math.max(max, curMax);
}
return max;
}
}
时间复杂度分析:
遍历数组一次,每个数只访问一次,因此时间复杂度为O(N)。
空间复杂度分析:
哈希表中存储了所有的数,因此空间复杂度为O(N)。