【经典算法题】可怜的小猪

【经典算法题】可怜的小猪

Leetcode 0458 可怜的小猪

题目描述:Leetcode 0458 可怜的小猪

在这里插入图片描述

分析

  • 本题的考点:数学

  • 使用n、m、p来代表题目中的buckets、minutesToDie、minutesToTest。则我们最多进行 k = ⌊ p m ⌋ k = \lfloor \frac{p}{m} \rfloor k=mp轮测试。

  • 首先考虑一个简单情况,如果k=1,相当于我们只能进行一轮测试,则我们需要将猪看成二进制猪,将某桶水的编号转化为二进制,二进制下如果第i位是1则让第i头猪喝这桶水,最后判断哪些猪死了,死的猪对应位为1,这样拼接得到有毒的水的编号。

  • k=1时,需要 ⌈ l o g 2 ( n ) ⌉ \lceil log_2(n) \rceil log2(n) 头猪。猜想:k轮的话,需要 ⌈ l o g k + 1 ( n ) ⌉ \lceil log_{k+1}(n) \rceil logk+1(n) 头猪。如下是证明:

  • 每只猪存在k+1中状态:k轮测试后没死(用0代表);第一轮后死了(用1代表);第二轮后死了(用2代表);…;第k轮后死了(用k代表)。

  • 假设最后需要x头猪,则必须要满足 ( k + 1 ) x ≥ n (k+1)^x \ge n (k+1)xn,这样才能区分出每种状态,所以:

x ≥ ⌈ l o g k + 1 ( n ) ⌉ x \ge \lceil log _{k+1} (n) \rceil xlogk+1(n)

  • 我们可以构造出一种方案,使得取到下界,假设猪的编号是0~x-1,水的编号为0~n-1,对于某桶水编号为y,我们可以把y看成一个k+1进制数,这样yx位,高位不足补0,如下图:

在这里插入图片描述

  • 对于这个k+1进制数,考虑其某一位a[i],表示这桶水什么时候喂给第i头猪:有k+1种取值,即0~k,如果为0,则这桶水不喂给第i头猪;为1的话则第一轮喂给第i头猪;…;为k的话则第k轮喂给第i头猪。

  • 对于有毒的那桶水,在k+1进制下,如何确定第i位的大小呢?第i头猪在在第几轮死,则这一位就是几,如果没死,就是0。

代码

  • C++
class Solution {
public:
    int poorPigs(int n, int minutesToDie, int minutesToTest) {
        int k = minutesToTest / minutesToDie;
        return ceil(log(n) / log(k + 1));
    }
};
  • Java
class Solution {
    public int poorPigs(int n, int minutesToDie, int minutesToTest) {
        int k = minutesToTest / minutesToDie;
        return (int) Math.ceil(Math.log(n) / Math.log(k + 1));
    }
}

时空复杂度分析

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值