森林中有未知数量的兔子。提问其中若干只兔子 "还有多少只兔子与你(指被提问的兔子)颜色相同?" ,将答案收集到一个整数数组
answers
中,其中answers[i]
是第i
只兔子的回答。给你数组
answers
,返回森林中兔子的最少数量。示例 1:
输入:answers = [1,1,2] 输出:5 解释: 两只回答了 "1" 的兔子可能有相同的颜色,设为红色。 之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。 设回答了 "2" 的兔子为蓝色。 此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。 因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。示例 2:
输入:answers = [10,10,10] 输出:11提示:
1 <= answers.length <= 1000
0 <= answers[i] < 1000
/**
* @param {number[]} answers
* @return {number}
*/
// 1、如果有一只\U0001f430兔子说还有n只兔子和它有相同的颜色,那么肯定会存在n+1只兔子
// 2、answers中并不是包含全部兔子,(回答我们的兔子)[2] [2,2] [2,2,2]一样的
// 3、假设answers = [2,2,2],只有当兔子的数量是3只的时候,才能满足,其中任意一个兔子,告诉我们,还有另外两只兔子和他自己是一样的颜色
// 4、answers = [2,2,2,2],可以拆分成两组,[2,2,2] 和[2]共6只
// 5、我们根据回答数组,按照回答的数量分类,并统计所有所有颜色分类的兔子
var numRabbits = function(answers) {
// 用map缓存每一类回答的数量
let map = new Map();
// 缓存结果,最少的兔子的数量
let result = 0;
// 遍历所有回答的数量,统计每一种回答出现的次数
for(const ans of answers){
map.set(ans,map.has(ans) ? map.get(ans) + 1 : 1);
}
// 根据每一种的回答的次数,计算兔子的数量
for(const [ans,count] of map){
// 统一每一类回答对应的兔子的数量
result +=
// 计算每一类颜色可以分为几组
Math.ceil(count / (ans + 1)) *
// 每一组兔子的数量
(ans + 1)
}
return result;
};