1078. 数组的度
给定由非负整数组成的非空数组,数组的度定义为出现频率最高的元素。
找出最短的连续子数组,并使得它和原数组有相同的度。返回该连续子数组的长度。
样例
样例 1:
输入: [2, 2]
输出: 2
样例 2:
输入: [1, 2, 2, 3, 1]
输出: 2
解释:
输入数组的度是2,1和2都出现了两次。
具有相同度的子串包括:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
其中长度最短为2。所以返回2。
注意事项
nums.length的范围在1到50,000之间。
nums[i]是范围为0到49,999的整数。
public class Solution {
/**
* @param nums: a list of integers
* @return: return a integer
*/
public int findShortestSubArray(int[] nums) {
// write your code here
int min = 0;
HashMap<Integer, Interval> hashMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (hashMap.containsKey(nums[i])) {
Interval temp = hashMap.get(nums[i]);
temp.end = i - temp.start;
temp.sum++;
hashMap.put(nums[i], temp);
} else {
hashMap.put(nums[i], new Interval(i, 1));
}
}
int max = 0;
for (Interval t : hashMap.values()) {
// System.out.println(t.sum+","+t.end);
if (t.sum > max) {
max = t.sum;
min = t.end;
}else if (t.sum == max) {
min = Math.min(min,t.end);
}
}
return min+1;
}
// Definition of Interval:
public class Interval {
int start, end, sum;
Interval(int start, int sum) {
this.start = start;
this.sum = sum;
}
}
}