题目:
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
哈希表解法:
class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
int n = nums.length;
for (int i = 0; i < n; i++) {
//如果哈希表包含这个数字就次数加一
if (map.containsKey(nums[i])){
//这个重复数字在哈希表中对应的value数组要次数加一和记录位置
map.get(nums[i])[0]++;
map.get(nums[i])[2] = i;
} else {
//没有出现在哈希表中的数字就记录进哈希表,
//结构为map(key为不重复数字:value为数组[次数,第一次出现索引位置,最后一次出现索引位置])
map.put(nums[i], new int[]{1, i, i});
}
}
int maxNum = 0, minLen = 0;
//遍历从哈希表取出来的value数组
for (Map.Entry<Integer, int[]> entry : map.entrySet()) {
int[] arr = entry.getValue();
//maxNum存储数字出现的最多次数
//minLen存储第一次出现位置到最后一次出现位置的长度
if (maxNum < arr[0]) {
maxNum = arr[0];
minLen = arr[2] - arr[1] + 1;
} else if (maxNum == arr[0]) {
if (minLen > arr[2] - arr[1] + 1) {
minLen = arr[2] - arr[1] + 1;
}
}
}
return minLen;
}
}