标题
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1c206c1f3d339653ed7fbdd0028fb872.png)
暴力代码
public static int findLeastNumOfUniqueInts(int[] arr, int k) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<arr.length;i++) {
if(!map.containsKey(arr[i])) map.put(arr[i], 1);
else map.put(arr[i], map.get(arr[i])+1);
}
int num=0;
while(num<k) {
int MinKey = 0;
int MinValue=Integer.MAX_VALUE;
for(Integer temp:map.keySet()) {
if(map.get(temp)<MinValue) {
MinKey = temp;
MinValue = map.get(temp);
}
}
if(MinValue<=k-num) {
num+=MinValue;
map.remove(MinKey);
}else {
map.put(MinKey, MinValue-k+num);
num+=k-num;
}
}
return map.size();
}
思路
- 暴力40/43
- 后面干脆把map按值排了个序,因为时间主要花费在找最小的数字上了
- 竟然和官方题解的思路一模一样
正确代码
public static int findLeastNumOfUniqueInts(int[] arr, int k) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<arr.length;i++) {
if(!map.containsKey(arr[i])) map.put(arr[i], 1);
else map.put(arr[i], map.get(arr[i])+1);
}
List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
int num=0;
int local=list.size()-1;
while(num<k) {
int MinKey = list.get(local).getKey();
int MinValue=list.get(local).getValue();
if(MinValue<=k-num) {
num+=MinValue;
map.remove(MinKey);
}else {
map.put(MinKey, MinValue-k+num);
num+=k-num;
}
local--;
}
return map.size();
}