Leetcode 1481. Least Number of Unique Integers after K Removals
题目链接: Least Number of Unique Integers after K Removals
难度:Medium
题目大意:
给一组数,去除k个数,使剩下的数字最少(重复的数只算一个),返回剩余数字的个数。
思路:
统计各个数字出现的次数,按次数进行排序,优先去除个数较少的数。
代码
方法1: 将TreeMap按value进行排序
class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
TreeMap<Integer,Integer> map=new TreeMap<Integer,Integer>();
for(int n:arr){
map.put(n,map.getOrDefault(n,0)+1);
}//key为arr重元素,value为元素出现的次数
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
int num=list.size();
for(Map.Entry<Integer, Integer> e:list){
Integer value=e.getValue();
if(k>=value){
num--;
k-=value;
}
else{
break;
}
}
return num;
}
}
方法2:用List来进行排序:
class Solution {
public int findLeastNumOfUniqueInts(int[] arr, int k) {
TreeMap<Integer,Integer> map=new TreeMap<Integer,Integer>();
for(int n:arr){
map.put(n,map.getOrDefault(n,0)+1);
}//key为arr中的元素,value为元素出现的次数
List<Integer> list=new ArrayList<>(map.keySet());
Collections.sort(list,(a,b)->map.get(a)-map.get(b));
//将list按map中的value进行排序
int num=map.size(),i=0;
while(k>0){
k-=map.get(list.get(i));
num--;
i++;
}
return k==0? num:num+1;
}
}