给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
解题思路:
1、先定义三个数组arr、min、max。
一个用来记录(统计)每个元素出现的次数,
一个用来记录第一次出现的位置,
一个用来记录最后一次出现的位置
2、做一次循环。
用数组nums的元素值作为arr(统计数组)的下标,来统计每个不相同元素出现的次数(出现就加一)。
同时记录第一次出现的位置和最后出现的一次位置,
例如:下面代码中的如果 min[nums[i]]==0 说明是第一次出现,就记录一下最开始出现的位置,最后一次出现的位置就按循环来,最后一次出现就是最后一次出现的 i 的值。(代码中加一是因为数组是从0开始的)
最后是需要再一次循环计算出最小的序列,因为可能会有同时好几个元素出现的频率一样。最终要的是最小的子序列的元素个数,因此需要计算每个元素第一次和最后一次出现的位置,相减得出最小的个数。
class Solution {
public int findShortestSubArray(int[] nums) {
int arr[]=new int[50000];
int min[]=new int[50000];
int max[]=new int[50000];
int count=0;
int a=nums.length;
for(int i=0;i<a;i++){
arr[nums[i]]++;
if(arr[nums[i]]>count){
count=arr[nums[i]];
}
if(min[nums[i]]==0){
min[nums[i]]=i+1;
}
max[nums[i]]=i+1;
}
int d=50000;
for(int j=0;j<nums.length;j++){
if(arr[nums[j]]==count){
int n=max[nums[j]]-min[nums[j]];
if(d>n){
d=n+1;
}
}
}
return d;
}
}