由于k有限,优先考虑删去出现次数较少的数字,这样才能在最少的次数内,达成不同整数的数目最少。
先将不同数字和其出现次数存入map中,再使用map.values()函数,将出现次数单独拎出,存入数组中,将数组排序之后,最小次数出现在数组前端。
class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
// 构造哈希映射
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int num : arr){
// 记录出现次数
int count = map.getOrDefault(num, 0)+1;
// 将数字和对应次数存入map
map.put(num, count);
}
// 构造数列
int n = map.size();
int[] freq = new int[n];
// 将出现次数存入数组,并排序
int i = 0;
for(int val: map.values()){
freq[i++] = val;
}
Arrays.sort(freq);
// 按k消除出现次数较小者
int ans = n;
for(int j = 0; j<n ; j++){
if(k>= freq[j]){
ans--;
k = k - freq[j];
}else{
break;
}
}
return ans;
}
}