系列文章目录
前言
本人最近再练习算法,所以会发布自己的解题思路,希望大家多指教
一、题目描述
一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面贴有箱子中藏有金币的数量。
从金币数量中选出一个数字集合,并销毁贴有这些数字的每个箱子,如果能销毁一半及以上的箱子,则返回这个数字集合的最小大小。
二、输出描述
一个数字字串,数字之间使用逗号分隔,例如: 6,6,6,6,3,3,3,1,1,5字串中数字的个数为偶数,并且
1 <= 字串中数字的个数 <= 100000
1 <= 每个数字 <= 100000
三、输入描述
这个数字集合的最小大小,例如: 2
四、java代码
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] array = Arrays.stream(scanner.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
Map<Integer, Integer> map = new HashMap<>();
//存放每个数字,及对应出现的次数
for (int i = 0; i < array.length; i++) {
map.put(array[i], map.getOrDefault(array[i], 0) + 1);
}
//根据出现次数倒序排序
map = map.entrySet().stream().sorted(Map.Entry.comparingByValue((o1, o2) -> o2 - o1)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o1,o2)->o1, LinkedHashMap::new));
//获取箱子数量的一半
int mul = array.length / 2;
//初始化箱子数量和
int sum = 0;
//初始化数字最小数量
int num = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
num++;
sum += entry.getValue();
//箱子数量超过一半,则直接输出最小数字集合大小
if (sum >= mul) {
System.out.println(num);
return;
}
}
}
五、测试用例
输入:
1,2,3,4,5,5,5,4,4,3
输出: