题目
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rabbits-in-forest
解析
情况分析:
1、当兔兔报的数字为0时,说明兔子的颜色是独一无二的,总数直接加一即可。
2、当有多个兔兔报相同的数字时,兔兔的颜色可能相同,也可能不同。此处举例说明,当有三只兔子同时报数为一时,若都按相同颜色处理,则该种颜色的兔子数量应该为二(见到的同种颜色兔子和自己本身,但有三只兔子报一,所以是矛盾的)说明三只同时报一的兔子颜色不完全相同,所以此处应该要加入阈值i+1(兔子报的数量加自己本身),若超过这个数则要按不同颜色的兔组来处理。
3、当兔兔报的数量不同时,说明颜色不同,按不同颜色处理。
此题重点考虑报数相同兔兔组(考虑报相同数字出现的次数与说报数字加一的大小比较即可)
未超出时:总数只需加一次即可
超出时:需加报相同数量的兔子数除以阈值取上限。
题解一
下面展示java段代码。
public int numRabbits(int[] answers) {
//每一个entry代表一种颜色的兔子,每一种颜色最多只能容纳key + 1个兔子,超过就要算别的颜色了
//key的value最大只能是key+1,否则就需要重置!
Map<Integer, Integer> map = new HashMap<>();
int res = 0;
for(int i = 0; i < answers.length; i++)
{
int temp = answers[i];
if(!map.containsKey(temp))
{
map.put(temp, 1);
}
else if(map.containsKey(temp))
{
int value = map.get(temp);
//达到了最大容量,重置一下
if(value == temp + 1)
{
res += temp + 1;
map.put(temp, 1);
}
//没达到最大容量加进去即可
else
{
value++;
map.put(temp, value);
}
}
}
for(Map.Entry<Integer, Integer> entry : map.entrySet())
{
//每一个entry都应该加上自己的最大容量(每个颜色的最少兔子数)
res += entry.getKey() + 1;
}
return res;
}
题解二
通过相同报数情况向上取整的方法(C写法)
int numRabbits(int* answers, int answersSize){
if (answers == NULL || answersSize == 0) {
return 0;
}
int b[1000] = {0};
for (int i = 0; i < answersSize; i++) {
b[answers[i]]++;
}
int cnt = 0;
for (int i = 0; i < 1000; i++) {
cnt += ((b[i] + i) / (i + 1)) * (i + 1);
}
return cnt;
}
ε=( o`ω′)ノ整理不易,有帮助的话点个赞再走吧!