题目描述
解题思路
这题需要我们找到满足最大频数的最小子序列,最大频数的出现必然是某个值或频数相等的某几个值,最短的子序列即在原序列中截取得到包含所有该数的子序列,如上例子中就是把最左边的2的左边的数全部去掉,最右边的2的右边的数全部去掉。
第一步:找到出现频数最高的数,它可能是一个或者多个。
第二步:分别截取包含所有这些数的最短连续数组。
第三步:返回以上几种情况中的最短的连续数组长度。
代码实现
class Solution {
public int findShortestSubArray(int[] nums) {
if(nums.length==0) {
return 0;
}
ArrayList<Integer> list = get(nums);
int minLen = 50000;
for(int x=0;x<list.size();x++) {
int num = list.get(x);
int i = 0;
int j = nums.length-1;
while (nums[i] != num && i < nums.length -1) {
i++;
}
while (nums[j] != num && j >= 0) {
j--;
}
int len = j-i+1;
if (len < minLen) {
minLen = len;
}
}
return minLen;
}
public ArrayList<Integer> get(int[] nums) {
int[] a = new int[50000];
ArrayList<Integer> list = new ArrayList<Integer>();
int max = 1;
for(int i=0;i<nums.length;i++) {
a[nums[i]] ++;
if(a[nums[i]] > max) {
max = a[nums[i]];
}
}
for(int i=0;i<50000;i++) {
if(a[i] == max) {
list.add(i);
}
}
return list;
}
}