题目概述:给定一个无序数组,问这个数组的元素能够组成的连续数组的最长长度为多少。
解题思路:很明显,我们需要对该数组先进行排序处理。我一开始用的是双指针,第一个指针枚举起点,第二个指针枚举该起点能够到达的最右边的距离,WA了。因为该数组有重复元素。(其实只要使用set去个重,这种方法就能AC了,不过当时没想到)。接着,我观察每个元素的数据范围在-1e9-1e9,而数组长度在1e5以内,这说明可以使用离散化的思想。对于无序离散化,可以直接使用map集合。再结合线性dp的思想,就能AC本题。
状态定义:f[i]:表示以i结尾的连续数组的最大长度
状态转移:f[i] = f[i - 1] + 1
状态起点:f[min] = 1
答案:Max(f[i])
代码:
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length == 0)return 0;
//排序
Arrays.sort(nums);
Map<Integer,Integer>map = new HashMap<>();
map.put(nums[0],1);
for(int i = 1; i < nums.length; i ++){
int key = nums[i];
int value = map.getOrDefault((nums[i] - 1),0) + 1;
map.put(key,value);
}
int res = 0;
for(int i : nums){
res = Math.max(res,map.get(i));
}
return res;
}
}
标签:map,nums,int,res,连续,数组,序列,最长,指针
From: https://www.cnblogs.com/dengch/p/17799898.html