可怜的小猪

🎯 问题描述(来源于LeetCode)

1
2
3
4
5
6
7
8
9
有 buckets桶液体,其中 正好有一桶 含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你有minutesToTest分钟时间来确定哪桶液体是有毒的。
喂猪的规则如下:
1. 选择若干活猪进行喂养
2. 可以允许小猪同时饮用任意数量的桶中的水,并且该过程不需要时间。
3. 小猪喝完水后,必须有minutesToDie分钟的冷却时间。在这段时间里,你只能观察,而不允许继续喂猪。
4. 过了minutesToDie分钟后,所有喝到毒药的猪都会死去,其他所有猪都会活下来。
5. 重复这一过程,直到时间用完。

给你桶的数目buckets,minutesToDie` 和 minutesToTest,返回在规定时间内判断哪个桶有毒所需的最小猪数_ 。

灵感思路

我原本的想法采取群组测试的思想直接求取编码位数,但想不到如何引进最大测试次数与其的关系。通过阅览宫水三叶大佬的题解中进制猜想 & 香农熵验证得以知道测试次数与编码进制有关,原因是编码所能存取小猪状态的最大信息容量

💻 代码实现

1
2
3
4
5
6
7
class Solution:
def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:
m=minutesToTest//minutesToDie
x=0
while (m+1)**x<buckets:
x+=1
return x

📊 性能分析

提交结果

  • 运行时间:0ms击败100.00%
  • 内存消耗:17.44MB击败71.72%

复杂度验证

  • 时间复杂度:O(Logb)O(Logb)
  • 空间复杂度:O(1)O(1)