解题思路(最直观最笨的方法):
1.遍历数组,借助辅助数组count,统计原数组中每个元素出现的次数
2.根据count中元素额值,求出数组的度
3.辅助二维数组arr,初始值为-1,存储数组的度对应的元素的最小索引和最大索引
4.遍历原数组的元素,找到与 nums
拥有相同大小的度的最短连续子数组,其长度=最大 索引-最小索引+1
代码实现:
class Solution {
public int findShortestSubArray(int[] nums) {
int len=nums.length;
if(len==1){
return 1;
}
int d=0;//数组的度
int[] count=new int[50000];//存储每个元素出现的次数
int[][] arr=new int[50000][2];//存储数组的度对应的元素的最小索引和最大索引
for(int i=0;i<len;++i){
arr[nums[i]][0]=-1;
arr[nums[i]][1]=-1;
count[nums[i]]++;
if(d<count[nums[i]]){
d=count[nums[i]];
}
}
//数组的度对应的元素的最小索引
for(int i=0;i<len;++i){
if(arr[nums[i]][0]==-1&&count[nums[i]]==d){
arr[nums[i]][0]=i;
}
}
//数组的度对应的元素的最大索引
for(int i=len-1;i>=0;--i){
if(arr[nums[i]][1]==-1&&count[nums[i]]==d){
arr[nums[i]][1]=i;
}
}
//求最小子数组长度
int min=50001;
for(int i=0;i<len;++i){
if(min>arr[nums[i]][1]-arr[nums[i]][0]+1&&arr[nums[i]][0]>=0&&arr[nums[i]][1]>=0){
min=arr[nums[i]][1]-arr[nums[i]][0]+1;
}
}
return min;
}
}