给定一个非空且只包含非负数的整数数组 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.示例 2: 输入:[1,2,2,3,1,4,2] 输出:6
697. 数组的度
/*统计数组中数字出现的频率 取最大值,以及最大值对应的数字 ---》依次查询对应数字的度*/
public int findShortestSubArray(int[] nums) {
// Key 数字 数组 最大次数,第一次出现位置,最后一次出现位置
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>();
int max = 1;// 最大出现次数
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
int count = ++ map.get(nums[i])[0];// 出现次数
map.get(nums[i])[2] = i;// 最后出现位置
max = Math.max(max,count);
} else {
map.put(nums[i], new int[] {1,i,i});
}
}
// 获取频率最大的数的度
Collection<int[]> values = map.values();
int minlen = 0;
for (int[] array : values) {
int count = array[0];
if (count != max) {
continue;
}
// 计算度的大小
if (minlen == 0) {
minlen = array[2]-array[1]+1;
} else {
minlen = Math.min(minlen, array[2]-array[1]+1);
}
}
return minlen;
}```