给定一个非空且只包含非负数的整数数组 nums
,数组的度的定义是指数组里任一元素出现频数的最大值。
你的任务是在 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.
示例 2:
输入:[1,2,2,3,1,4,2] 输出:6
提示:
nums.length
在1到 50,000 区间范围内。nums[i]
是一个在 0 到 49,999 范围内的整数。
我的Java代码:
思路:题意实际上就是求【数组中出现最多的元素】的首尾位置的差。用一个数组来记录原数组中元素出现的次数,由于出现次数最多的元素可能有多个,所以再用一个列表存储【数组中出现最多的元素】的最后位置。在遍历完原数组并找到【数组中出现最多的元素】后,遍历列表并从原数组中找到该元素的首位置,比较列表中的元素的首尾位置差,返回最小值。
class Solution {
public int findShortestSubArray(int[] nums) {
int[] counters = new int[50000];
List<Integer> rearlist = new ArrayList<Integer>();
int max = 0;
for(int i = 0;i < nums.length;i++) {
counters[nums[i]]++;
if(counters[nums[i]] > max) {
max = counters[nums[i]];
rearlist.clear();
rearlist.add(i);
}else if(counters[nums[i]] == max) {
rearlist.add(i);
}
}
int min = Integer.MAX_VALUE;
Iterator<Integer> it = rearlist.iterator();
while(it.hasNext()) {
int head = 0, rear = it.next();
int num = nums[rear];
for(head = 0;head < rear;head++) {
if(nums[head] == num) {
break;
}
}
if(min > rear-head) {
min = rear-head;
}
}
return min+1;
}
}