题目
森林中有未知数量的兔子。提问其中若干只兔子 “还有多少只兔子与你(指被提问的兔子)颜色相同?” ,将答案收集到一个整数数组 answers 中,其中 answers[i] 是第 i 只兔子的回答。
给你数组 answers ,返回森林中兔子的最少数量。
例如:
输入:answers = [1,1,2]
输出:5
解释:
两只回答了 "1" 的兔子可能有相同的颜色,设为红色。
之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。
设回答了 "2" 的兔子为蓝色。
此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。
因此森林中兔子的最少数量是 5 只:3 只回答的和 2 只没有回答的。
思路
由示例,我们最好是把回答了相同数字的兔子当作相同的颜色,那么可以得到森林中最少的兔子数量。
-
特殊情况:答案是0的兔子,说明这些兔子的颜色在森林里独一无二。无论数量最多还是最少,这类颜色的兔子都只有它们自己一只。
-
回答相同数字的兔子数量≤\leq≤回答数字+1,最少的情况即为:回答数字+1
例如:一共有3只兔子回答5,那么最少的情况就是,这三只兔子都是同一个颜色,对于任何一只兔子而言,回答的数字5都包括另外两只。那么加上回答的兔子自己,这种颜色的兔子最少有6只 -
回答相同数字的兔子数量>>>回答数字+1:
比如有7只兔子回答2,那么这7只兔子不可能都是同一种颜色.应当把它们分为(2+1)=3个一组:2,2,2∣2,2,2∣22,2,2|2,2,2|22,2,2∣2,2,2∣2每一组的兔子为同一种颜色,按照步骤2的方法计算总共的兔子数量。
比如按照这个举例应当是(2+1)*3=9只兔子为最少的情况
代码
class Solution:
def numRabbits(self, answers: List[int]) -> int:
rabibit_num=0
D={x:0 for x in answers}
for x in answers:
D[x]+=1
for x in D:
if x+1>=D[x] and x>0:
rabibit_num+=x+1
elif x+1<D[x] and x>0:
if D[x]%(x+1)==0:
rabibit_num+=D[x]//(x+1)*(x+1)
else:
rabibit_num+=D[x]//(x+1)*(x+1)+(x+1)
elif x==0:
rabibit_num+=D[x]
return rabibit_num
给定兔子回答颜色相同兔子的数量数组,程序需计算森林中兔子的最小数量。当答案为0时,表示独特颜色的兔子;若答案为x,则至少有x+1只同色兔子。代码实现通过统计每个答案的出现次数,判断是否满足x+1的关系来确定最少兔子数。
389

被折叠的 条评论
为什么被折叠?



