问题背景
森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answersanswersanswers 中,其中 answers[i]answers[i]answers[i] 是第 iii 只兔子的回答。
给你数组 answersanswersanswers,返回森林中兔子的最少数量。
数据约束
- 1≤answers.length≤10001 \le answers.length \le 10001≤answers.length≤1000
- 0≤answers[i]<10000 \le answers[i] < 10000≤answers[i]<1000
解题过程
找规律,考虑到要求数量最少,假设当前数组元素是 itemitemitem,它共有 numnumnum 个等值元素,那么答案会增加 ⌈numitem+1⌉\lceil \frac{num}{item + 1} \rceil⌈item+1num⌉。
建立数组元素与数量之间的哈希映射,再遍历计算结果即可。
具体实现
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;
}
}