题目:给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。Leetcode697
示例 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
思路:看到该题用一个map的解法,觉得比较有意思,所以记录一下。 用map<Integer,int[]>记录信息。键是原数组的每个元素,int[] 中记录三个信息,int[0]表示该元素的度,int[1]表示该元素第一次出现的地方,int[2]表示元素第二次出现的地方。int[2]-int[1]+1就是包含该元素的最短连续子数组的长度。
class Solution {
public int findShortestSubArray(int[] nums) {
if(nums.length==0 || nums==null){
return 0;
}
Map<Integer,int[]> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],new int[]{1,i,i});
}else{
int[] arr = map.get(nums[i]);
arr[0]++;
arr[2] = i;
}
}
int degree = 0;
int res = 0;
for(int[] value : map.values()){
if(value[0]>degree){
degree = value[0];
res = value[2] - value[1] +1;
}else if(value[0]==degree){
res = Math.min(res,value[2]-value[1]+1);
}
}
return res;
}
}