最长连续数列 LeetCode 128
题目:
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
来源:力扣(LeetCode)
链接:link
代码:java
import java.util.*;
public class 最长连续数列128 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int [] nums = {100,4,200,1,3,2};
System.out.println(longestConsecutive(nums));
}
public static int longestConsecutive (int [] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for(int num : nums) {
num_set.add(num);
}
int longestStreak = 0;
for(int num : num_set) {
if(!num_set.contains(num -1)) {
int currentNum = num;
int currentStreak = 1;
while (num_set.contains(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
}
解题关键点
创建哈希表
每个数只判断一次,如果含有比自己小1的数直接跳过
调用哈希表的contains(x)方法判断哈希表内是否存在x
复杂度分析
时间复杂度:O(n)O(n),其中 nn 为数组的长度。具体分析已在上面正文中给出。
空间复杂度:O(n)O(n)。哈希表存储数组中所有的数需要 O(n)O(n) 的空间