LeetCode: 128. 最长连续序列
【hard】
给定一个未排序的整数数组 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 < = n u m s . l e n g t h < = 1 0 4 0 <= nums.length <= 10^4 0<=nums.length<=104
− 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 −109<=nums[i]<=109
定义一个哈希表,存储每个元素和以每个元素结尾的序列长度的映射关系,最后返回最长的序列长度即可。
用递归函数forwar查找最长序列长度。
java:
class Solution {
public int longestConsecutive(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, 1);
}
for (int num : nums) {
forward(map, num);
}
int max = 0;
for (int n : map.keySet()) {
max = Math.max(max, map.get(n));
}
return max;
}
public int forward(Map<Integer, Integer> map, int num) {
if (!map.containsKey(num)) return 0;
int count = map.get(num);
if (count > 1) return count;
count = forward(map, num + 1) + 1;
map.put(num, count);
return count;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
参考:
https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/zui-chang-lian-xu-xu-lie-by-leetcode-solution/
首先用HashSet去重,然后遍历所有去重的元素,如果set中包含num+1,则长度加1,当前元素加1,最后返回最大的长度。为了减少重复计算,加判断条件:set中不包含比当前元素小1的元素时再计算,否则跳过。
java:
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) set.add(num);
int max_len = 0;
for (int num : set) {
if (!set.contains(num - 1)) {
int cur_num = num;
int cur_len = 1;
while (set.contains(cur_num + 1)) {
cur_num += 1;
cur_len += 1;
}
max_len = Math.max(max_len, cur_len);
}
}
return max_len;
}
}
时间复杂度:O(n)
空间复杂度:O(n)