难度:中等
频次:42
题目:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
解题思路:因为要O(n),不能重新排序,hashmap+动态规划
可以hashmap+set(去重+判断当都一个key是否存在)
注意:
- 创建一个hashma放nums中的元素
- 如果num之前没有放到hashmap中
- 读取num-1 num+1值的连续序列值,分别作为left和right
- 计算加上num的连续序列值 len=left+right+1
- 跟之前的结果做对比,看看哪个len比较大
- 把num的key放回hashmap中
- 把num-left,num+right的 值标记为len
代码:
class Solution {
public int longestConsecutive(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
//res存储结果
int res=0;
//for循环遍历
for(int num:nums){
//map中不存在num
if(!map.containsKey(num)){
//读取num左边、右边的连续序列值
int left=map.getOrDefault(num-1,0);
int right=map.getOrDefault(num+1,0);
//算num的连续序列值
int len=left+right+1;
//跟之前遍历过的数字比较,看看比较长的连续序列值是多少
res=Math.max(len,res);
//把计算的结果放回map中
//num的值可以为任意值
map.put(num,-1);
//num左边连续序列值(left)的key都标记为len
map.put(num-left,len);
//右边同理
map.put(right+num,len);
}
}
return res;
}
}