1,题目
2,思路
- 创建数字为key,数字出现次数为value的哈希表
- 获取哈希的value,用list装好
- 将list从大到小排序(从最大的开始拿)
- 返回最小的次数
3,代码
import java.util.*;
public class Leetcode1338 {
public static void main(String[] args) {
System.out.println(new Solution1338().minSetSize(new int[]{3, 3, 3, 3, 5, 5, 5, 2, 2, 7}));
}
}
class Solution1338 {
public int minSetSize(int[] arr) {
int len = arr.length / 2;//获取折半长度
Map<Integer, Integer> map = new HashMap<>();
List<Integer> arrVaule = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {//创建哈希表
if (map.containsKey(arr[i])) {
int n = map.get(arr[i]);
map.put(arr[i], ++n);
} else map.put(arr[i], 1);
}
Set<Integer> set = map.keySet();
for (Integer i : set) {//创建接收哈希表value的逆序表
arrVaule.add(map.get(i));
}
arrVaule.sort((Integer o1, Integer o2) -> o2 - o1);//降序排序
int conunt = 0;
int nums = 0;
for (Integer i : arrVaule) {//从最长次数开始找,不满足nums>len要求循环继续且返回次数+1
nums += i;
conunt++;
if (nums >= len) {
break;
}
}
return conunt;
}
}