给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是[1,2,3,4]。它的长度为4。
示例2:输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
可以使用 HashSet 来存储数组中的所有数字,然后对每个数字检查它是否是连续序列的开始(也就是说,检查 num - 1
是否不在集合中)。如果是序列的开始,那么我们继续检查 num + 1
, num + 2
, num + 3
等等是否在集合中,直到找不到下一个数字为止。这样我们就能找到以当前数字开始的最长连续序列,并更新最大长度。
这个算法的时间复杂度是 O(n),因为每个数字最多被访问两次:一次是加入 HashSet,另一次是在找连续序列时。
Java 代码实现:
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> numSet = new HashSet<>();
for (int num : nums) {
numSet.add(num);
}
int longestStreak = 0;
for (int num : numSet) {
// 只有当 num - 1 不在集合中时,才考虑 num 是连续序列的开始
if (!numSet.contains(num - 1)) {
int currentNum = num;
int currentStreak = 1;
// 检查 num + 1, num + 2, ... 是否在集合中
while (numSet.contains(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
// 更新最长序列长度
longestStreak = Math.max(longestStreak, currentStreak);
}
}
return longestStreak;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums1 = {100, 4, 200, 1, 3, 2};
System.out.println(solution.longestConsecutive(nums1)); // 输出应为 4
int[] nums2 = {0, 3, 7, 2, 5, 8, 4, 6, 0, 1};
System.out.println(solution.longestConsecutive(nums2)); // 输出应为 9
}
}