697. 数组的度
给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例 1: 输入:[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.
注解见下面:
class Solution {
public int findShortestSubArray(int[] nums) {
//记录出现多少次的hash
Map<Integer,Integer> countMap=new HashMap();
//记录一开始这个key的出现位置的 hash
Map<Integer,Integer> firstMap=new HashMap();
//记录最后这个key的出现位置的 hash
Map<Integer,Integer> lastMap=new HashMap();
//定义最大值,最小值
int max=0;
int min=Integer.MAX_VALUE;
//更新最大值,找出最大度,同时记录第一次出现位置,最后一次出现位置
for(int i=0;i<nums.length;i++){
countMap.put(nums[i],countMap.getOrDefault(nums[i],0)+1);
if(countMap.get(nums[i])>max){
max=countMap.get(nums[i]);
}
if(!firstMap.containsKey(nums[i])){
firstMap.put(nums[i],i);
}
lastMap.put(nums[i],i);
}
//分析度这个元素第一次出现的位置和最后一次出现的位置
for(int i=0;i<nums.length;i++){ //因为可能有好多元素对应这个最大度,所以要循环遍历每一个元素
//找到最大度 对应的key值
if(max==countMap.get(nums[i])){
//更新最小值
min=Math.min(lastMap.get(nums[i])-firstMap.get(nums[i])+1,min);
}
}
return min;
}
}