问题背景
森林中有未知数量的兔子。提问其中若干只兔子 "还有多少只兔子与你(指被提问的兔子)颜色相同?" ,将答案收集到一个整数数组 a n s w e r s answers answers 中,其中 a n s w e r s [ i ] answers[i] answers[i] 是第 i i i 只兔子的回答。
给你数组 a n s w e r s answers answers,返回森林中兔子的最少数量。
数据约束
- 1 ≤ a n s w e r s . l e n g t h ≤ 1000 1 \le answers.length \le 1000 1≤answers.length≤1000
- 0 ≤ a n s w e r s [ i ] < 1000 0 \le answers[i] < 1000 0≤answers[i]<1000
解题过程
找规律,考虑到要求数量最少,假设当前数组元素是 i t e m item item,它共有 n u m num num 个等值元素,那么答案会增加 ⌈ n u m i t e m + 1 ⌉ \lceil \frac{num}{item + 1} \rceil ⌈item+1num⌉。
建立数组元素与数量之间的哈希映射,再遍历计算结果即可。
具体实现
java
class Solution {
public int numRabbits(int[] answers) {
Map<Integer, Integer> count = new HashMap<>();
for (int item : answers) {
count.merge(item, 1, Integer::sum);
}
int res = 0;
for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
int item = entry.getKey();
int num = entry.getValue();
res += (item + num) / (item + 1) * (item + 1);
}
return res;
}
}