问题理解
一个序列中,有些数字会重复出现多次,如果数n重复出现次数最多,那么寻找一个包含所有n的最短子列。
思路
- 用HashMap存每个数及它出现的次数
- 对Value排序找到最大出现次数的数(集)
- 遍历出现次数最多的数集,同时确定其在序列中首次出现的位置pos1,末次出现位置pos2,找到最小的pos2-pos1+1就是问题的答案
分析
- 时间复杂度O(n)
- 空间复杂度O(n)
- 待优化,但是AC了就懒得弄了
// 有效片段
HashMap<Integer, Integer> hashSet = new HashMap<Integer, Integer>();
for(int num:nums) {
if(hashSet.containsKey(num)) {
int newVal = hashSet.get(num) + 1;
hashSet.put(num, newVal);
}
else {
hashSet.put(num, 1);
}
}
ArrayList<Integer> arrayList = new ArrayList<Integer>();
int max = 0;
for(int key:hashSet.keySet()) {
if (hashSet.get(key) > max) {
max = hashSet.get(key);
}
}
for(int key:hashSet.keySet()) {
if (hashSet.get(key)== max) {
arrayList.add(key);
}
}
int len = 0, min = 0;
for(int poss:arrayList) {
int pos1 = 0, pos2 = 0;
for (int i = 0; i < nums.length; i++)
if (nums[i] == poss) {
pos1 = i;
break;
}
for (int i = nums.length -1; i > 0; i--)
if (nums[i] == poss) {
pos2 = i;
break;
}
if(len == 0) {
len = pos2 - pos1 + 1;
min = len;
}else {
len = pos2 - pos1 + 1;
if(len < min)
min = len;
}
}