📜  必须存在于森林中的最小兔子数量(1)

📅  最后修改于: 2023-12-03 15:09:54.068000             🧑  作者: Mango

必须存在于森林中的最小兔子数量

介绍

在森林中,兔子可以通过通信来决定自己的颜色。如果一个兔子发现他的颜色与其他兔子的颜色相同并且另一个兔子说他们的颜色是不同的,那么这个兔子就会死亡。给定一个包含不同兔子数量的数组,我们需要确定必须存在于森林中的最小兔子数量。

解法

根据兔子数量和颜色相同的兔子数量,我们可以得到最小兔子数量为:

int min_rabbits = 0;
unordered_map<int, int> count; // 存储兔子数量和颜色

for (int rabbit : rabbits) {
    count[rabbit]++;
    if (count[rabbit] == rabbit + 1) { // 此时说明已有 rabbit + 1 只相同颜色的兔子存在
        min_rabbits += rabbit + 1;
        count.erase(rabbit);
    }
}
// 非特殊情况下,剩余数量需单独计算,最小兔子数量为 min_rabbits + 不同颜色兔子数量
for (auto it : count) {
    min_rabbits += it.first + 1;
}
return min_rabbits;
示例

例如,给定兔子颜色的数组 [1,1,2]

min_rabbits([1, 1, 2])

输出结果为 3,因为必须存在至少三只不同颜色的兔子。至少有两只颜色为红色,一只为蓝色。

注意事项
  1. 数组为空或者为null,则最小兔子数量为0
  2. 兔子数量和颜色不能为0或负数,否则抛出异常。
  3. 兔子数量和颜色最大值为1000,超过时抛出异常。