给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
输入: [1, 2, 2, 3, 1]
输出: 2
解释:
输入数组的度是2,因为元素1和2的出现频数最大,均为2.
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组[2, 2]的长度为2,所以返回2.
输入:[1,2,2,3,1,4,2]输出:6
本题可以通过利用三个hashmap解决,其中map用来存储元素出现频数,leftindex用来存储每个元素的最左出现位置,rightindex用于存储每个元素的最右出现位置,之后初始化max并遍历map,若当前元素出现次数大于max,则将max更新为当前元素出现次数并将最小长度更新为当前元素右边界-左边界,若当前元素出现次数等于max,判断当前元素跨越范围与最小长度的大小,若小于最小长度,则将最小长度更新为当前元素跨越的范围。
public int findShortestSubArray(int[] nums) {
HashMap<Integer,Integer> map=new HashMap(),leftindex=new HashMap(),rightindex=new HashMap();
//初始化三个hashmap
for(int i=0;i<nums.length;i++){
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
if(!leftindex.containsKey(nums[i]))
leftindex.put(nums[i],i);
rightindex.put(nums[i],i);
}
int max=0;
int ans=0;
int num=0;
for(Map.Entry<Integer,Integer> entry:map.entrySet())
{
if(entry.getValue()>max)
{
max=entry.getValue();
num=entry.getKey();
ans=rightindex.get(num)-leftindex.get(num)+1;
}
if(entry.getValue()==max)
{
num=entry.getKey();
if(rightindex.get(num)-leftindex.get(num)<ans)
ans=rightindex.get(num)-leftindex.get(num)+1;
}
}
return ans;
}