1、题目链接
森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rabbits-in-forest
2、思路
如果一只兔子说了一个数字num
,那么,具有与该兔子相同颜色的兔子总数一共是num+1
。
这也就是说,在剩余的answers
中,如果出现num
的次数不超过num
次,那么所有的说num
的兔子均可以看作是具有相同颜色的;如果num
的次数超过了num
,那么从第num+1
个(在整个answers
数组中是第num+2
个)开始,需要将兔子重新标记为另一种颜色。
例如,answers=[2,2,2,2]
,那么前三个2
就可以视为具有相同颜色的兔子,第四个是另外的颜色,因此,兔子的数量最少需要3+3=6。
因此,统计每个数字 n u m num num出现的次数 c o u n t n u m count_{num} countnum,然后按照每 n u m + 1 num+1 num+1个为一组进行划分,假设一共划分了 m m m组,剩余 r r r个(显然, 0 < = r < ( n u m + 1 ) 0<=r<(num+1) 0<=r<(num+1),如果 r > 0 r>0 r>0对于这些兔子,需要的最少的数量仍然是 n u m + 1 num+1 num+1个),那么,对于数字 n u m num num,所需要的最少的兔子的数量为 ( m + 1 ) ∗ ( n u m + 1 ) (m+1)*(num+1) (m+1)∗(num+1)。
3、代码
在编码的时候,需要在出现整除的时候多加注意,此时,兔子的数量应该是 m ∗ ( n u m + 1 ) m*(num+1) m∗(num+1)。对应于上述思路的python代码如下:
class Solution:
def numRabbits(self, answers: List[int]) -> int:
count = {}
total = 0
for i in answers:
if not count.get(i):
count[i] = 1
else:
count[i] += 1
for k in count:
if k == 0:
total += count[k]
else:
m = count[k] // (k + 1)
r = count[k] % (k + 1)
if m == 0:
total += k + 1
else:
weight = 0 if r == 0 else 1
total += (m + weight) * (k + 1)
return total