森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。
给你数组 answers ,返回森林中兔子的最少数量。
https://leetcode.cn/problems/rabbits-in-forest/
- 数学归纳:[2,2,2] 、[2,2]、[2]均为最少3只
- 向上取整:
a / b -> (a + b - 1) / b
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
*/
package com.huawei.prac;
import java.util.HashMap;
import java.util.Map;
public class Solution4th {
static int maxCount;
public static void main(String[] args) {
int[] answers = {1, 1, 2};
System.out.println(numRabbits(answers)); // 5
System.out.println(numRabbits(new int[]{10, 10, 10})); // 11
System.out.println(numRabbits(new int[]{1, 0, 1, 0, 0})); // 5
}
/**
* 781. 森林中的兔子[哈希表]
*
* @param answers 兔子回答数组
* @return 最少的兔子数量
*/
public static int numRabbits(int[] answers) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : answers) {
map.merge(num, 1, (oldV, newV) -> oldV + 1);
}
int minNum = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
// 向上取整
int multiple = (entry.getValue() + entry.getKey()) / (entry.getKey() + 1);
minNum += multiple > 1 ? multiple * (entry.getKey() + 1) : entry.getKey() + 1;
}
return minNum;
}
}