博客
关于我
杂谈:经典算法之不幸的猪
阅读量:292 次
发布时间:2019-03-03

本文共 1137 字,大约阅读时间需要 3 分钟。

0. 引言

接着之前的,我们再来一道经典的算法题好了,也算是温故而知新。

而且讲道理这些题目真心还是蛮有意思的,不是那种纯粹的就是练习熟练度,而是真的需要去锻炼看问题的方式。

1. 题目描述

这次我们来看看不幸的猪这道题,它在leetcode当中同样有收录,对应。

给出leetcode当中的题目描述如下:

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

2. 算法解析

这一题考察的是其实是k进制,如果你能想到这一点,那么这一题就是可以直接解析求解的。

假设在给定的测试时间内可以做n轮实验。那么,对于任意一只猪,事实上它可以有i+1种状态表示,分别为刚好在第 i i i次死亡( i = 1... n i=1...n i=1...n)或者最终存活。

所以,我们只需要将总的水桶数用 n + 1 n+1 n+1进制进行表达,那么,它的位数即是最终我们所需要的最少的猪的个数。

特别的,当 n = 1 n=1 n=1时,问题就退化成了最简单的二进制问题。

3. 代码实现

我们直接给出python代码实现如下:

class Solution:    def poorPigs(self, buckets: int, minutesToDie: int, minutesToTest: int) -> int:        k = minutesToTest // minutesToDie + 1        return math.ceil(math.log(buckets) / math.log(k))

提交代码评测得到:耗时28ms,击败了98.28%的提交的结果。

4. 后记

这个题目算是少数几道我实际在面试中遇到过的题目,可惜当时没能想清楚,纠结于二进制而没有往外多走一步扩展到k进制,可惜了,不过现在想想,确实是一道非常有意思的题目,这次就写在这里,与君共勉吧。

转载地址:http://rnyl.baihongyu.com/

你可能感兴趣的文章
Netty 4的内存管理:sun.misc.Unsafe
查看>>
Netty channelRegistered\ChannelActive---源码分析
查看>>
Netty NIO transport && OIO transport
查看>>
netty php,netty
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Vue过渡 & 动画---vue工作笔记0014
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty 的 Handler 链调用机制
查看>>
Netty 编解码器和 Handler 调用机制
查看>>
Netty 编解码器详解
查看>>
Netty 解决TCP粘包/半包使用
查看>>
Netty 调用,效率这么低还用啥?
查看>>
Netty 高性能架构设计
查看>>
Netty+Protostuff实现单机压测秒级接收35万个对象实践经验分享
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
netty--helloword程序
查看>>
netty2---服务端和客户端
查看>>
【Flink】Flink 2023 Flink易用性和稳定性在Shopee的优化-视频笔记
查看>>
Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
查看>>