package com.heu.wsq.leetcode.arr;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* 697. 数组的度
* @author wsq
* @date 2021/1/18
* 给定一个非空且只包含非负数的整数数组 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.
*
* 链接:https://leetcode-cn.com/problems/degree-of-an-array
*/
public class FindShortestSubArray {
public int findShortestSubArray(int[] nums){
int n = nums.length;
Map<Integer, int[]> freqMap = new HashMap<>();
int max = -1;
for (int i = 0; i < n; i++) {
int val;
if (!freqMap.containsKey(nums[i])){
int[] arr = new int[3];
arr[0] = i;
arr[1] = i;
arr[2] = 1;
freqMap.put(nums[i], arr);
val = arr[2];
}else{
int[] arr = freqMap.get(nums[i]);
arr[1] = i;
arr[2] += 1;
freqMap.put(nums[i], arr);
val = arr[2];
}
if (val > max){
max = val;
}
}
int res = Integer.MAX_VALUE;
for (Integer key : freqMap.keySet()) {
int[] arr = freqMap.get(key);
if (arr[2] == max){
res = Math.min(res, arr[1] - arr[0] + 1);
}
}
return res;
}
}