leetcode 781. 森林中的兔子
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rabbits-in-forest
题目描述
森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 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
贪心思路
首先,根据兔子的回答:因此我们可以得出以下结论:
- 同一颜色的兔子回答的数值必然是一样的
- 但回答同样数值的,不一定就是同颜色兔子
举个🌰,假如有 3 只白兔,每只白兔的回答必然都是 2(对应结论 1);但假如有兔子回答了数值 2,可能只是三只白兔,也可能是三只白兔和三只灰兔同时进行了回答(对应结论 2)。
答案要我们求最少的兔子数量。
不妨设有某种颜色的兔子 m 只,它们回答的答案数值为 cnt,那么 m 和 cnt满足什么关系?
显然两者关系为 m=cnt+1。
但如果是在 answers 数组里,回答 cntcnt 的数量为 t 的话呢?这时候我们需要分情况讨论:
t⩽cnt+1: 为达到「最少的兔子数量」,我们可以假定这 t 只兔子为同一颜色,这样能够满足题意,同时不会导致「额外」兔子数量增加(颜色数量最少)。
t>cnt+1 : 我们知道回答 cntcnt 的兔子应该有 cnt+1cnt+1 只。这时候说明有数量相同的不同颜色的兔子进行了回答。为达到「最少的兔子数量」,我们应当将 tt 分为若干种颜色,并尽可能让某一种颜色的兔子为 cnt+1cnt+1 只,这样能够满足题意,同时不会导致「额外」兔子数量增加(颜色数量最少)。
换句话说,我们应该让「同一颜色的兔子数量」尽量多,从而实现「总的兔子数量」最少。
代码
/**
* 计算兔子的最低数量
* @param cs
* @return
*/
public int numRabbits(int[] cs) {
Arrays.sort(cs);
int ans = 0;
int n = cs.length;
for (int i = 0; i < n;i++){
int num = cs[i];
ans += (num + 1);
int k = num;
while (k-- > 0 && i + 1 < n && cs[i] == cs[i + 1]){
i++;
}
}
return ans;
}