也没想到
题目
https://leetcode-cn.com/problems/degree-of-an-array/
分析
我们使用哈希表实现该功能,每一个数映射到一个长度为 3 的数组,数组中的三个元素分别代表这个数出现的次数、这个数在原数组中第一次出现的位置和这个数在原数组中最后一次出现的位置。当我们记录完所有信息后,我们需要遍历该哈希表,找到元素出现次数最多,且前后位置差最小的数。
代码
class Solution {
public int findShortestSubArray(int[] nums) {
int len=nums.length;
HashMap<Integer,int[]> map=new HashMap<>();//次数,第一次,最后一次
int max_count=1;
for(int i=0;i<len;i++){
if(map.containsKey(nums[i])){
int[] abc=map.get(nums[i]);
int a=abc[0];
a++;
max_count=Math.max(max_count,a);
int b=abc[1];
int c=abc[2];
c=i;
map.put(nums[i],new int[]{a,b,c});
}
else{
int a=1;
int b=i;
int c=i;
map.put(nums[i],new int[]{a,b,c});
}
}
int min_len=Integer.MAX_VALUE;
for(int[] abc:map.values()){
int a=abc[0];
int b=abc[1];
int c=abc[2];
if(a==max_count){
min_len=Math.min(min_len,c-b+1);
}
}
return min_len;
}
}
复杂度
时间复杂度O(N):遍历原数组和哈希表一次
空间复杂度O(N)