用哈希表存储每一个子数组的信息;
numsCnt 存储子数组的度
numsLeftIndex 存储子数组的起始位置
numsRightIndex 存储子数组的终止位置
一个特定数字(num)的子数组的信息
numsCnt.get(num);
numsLeftIndex.get(num);
numsRightIndex.get(num);
找出度最大的子数组集中长度最小的子数组
class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer,Integer> numsCnt = new HashMap<>();
Map<Integer,Integer> numsLeftIndex = new HashMap<>();
Map<Integer,Integer> numsRightIndex = new HashMap<>();
for(int i = 0;i<nums.length;i++){
int num = nums[i];
numsCnt.put(num,numsCnt.getOrDefault(num,0)+1);
numsRightIndex.put(num,i);
if(!numsLeftIndex.containsKey(num)) numsLeftIndex.put(num,i);
}
int ans = nums.length;
int degree = Collections.max(numsCnt.values());
//System.out.println(degree);
for(int i = 0;i<nums.length;i++){
if(degree != numsCnt.get(nums[i])) continue;
ans = Math.min(ans,numsRightIndex.get(nums[i])-numsLeftIndex.get(nums[i])+1);
}
return ans;
}
}