题目链接:LeeCode697数组的度
题目描述:
题目有点绕嘴就是说求出数组的最大度,度就是数组最多拥有多少个相同的数,然后让子序列在保证度相同的同时尽可能短。
思路非常简单,我使用了一个hashmap,每个键对应一个长度为3的数组,degree[0]存度,degree[1]存该数在序列中起点,degree[2]则存终点。然后找出最大度里面起点和终点差最小的,效率还是蛮高得
class Solution {
public static int findShortestSubArray(int[] nums) {
Map<Integer,int[]> map=new HashMap<>();
int max=1,min=Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
//如果不存在,初始化度,起点和终点
if(!map.containsKey(nums[i])){
int[] degree=new int[3];
//degree[0]存度,degree[1]存该数在序列中起点,degree[2]则存终点
degree[0]=1;
degree[1]=i;
degree[2]=i;
map.put(nums[i], degree);
}else{//已经存在度加一,七点不用管终点向后刷新
int[] ints = map.get(nums[i]);
ints[0]=ints[0]+1;
//记录最大的度是多少
if(ints[0]>max)max=ints[0];
ints[2]=i;
map.put(nums[i], ints);
}
}
//在最大的度里面找最短的序列
for (Integer integer : map.keySet()) {
int[] ints = map.get(integer);
if(ints[0]==max&&min>ints[2]-ints[1]){
min=ints[2]-ints[1];
}
}
return min+1;
}
}