【LeetCode 簡單題】105-可憐的小豬
阿新 • • 發佈:2018-11-27
宣告:
今天是第105道題。有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外觀看起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。問題來了,如果需要你在一小時內,弄清楚哪隻水桶含有毒藥,你最少需要多少隻豬?以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:有1000只水桶,其中有且只有一桶裝的含有毒藥,其餘裝的都是水。它們從外觀看起來都一樣。如果小豬喝了毒藥,它會在15分鐘內死去。問題來了,如果需要你在一小時內,弄清楚哪隻水桶含有毒藥,你最少需要多少隻豬?回答這個問題,併為下列的進階問題編寫一個通用演算法。
進階:
假設有 n 只水桶,豬飲水中毒後會在 m 分鐘內死亡,你需要多少豬(x)就能在 p 分鐘內找出“有毒”水桶?n只水桶裡有且僅有一隻有毒的桶。
解法1。1只小豬最多可以測試p/m次,可以檢測p/m+1桶水(+1是因為給定的水裡必有毒,雖然只能測p/m次,但剩下1桶不證自明);2只小豬可以分為x-y二維座標系,1只負責x軸,1只負責y軸,從左下角開始試,最多可以試(p/m+1)^2桶水,那麼同理,推廣到n只豬,就是n維座標系,總結一下規律如下。那麼反過來已知桶數求最少的豬就很好求了,程式碼如下。
- 1只豬:p/m+1桶水
- 2只豬:(p/m+1)^2桶水
- 3只豬:(p/m+1)^3桶水
- ……
- n只豬:(p/m+1)^n桶水
執行用時: 24 ms, 在Poor Pigs的Python提交中擊敗了89.80% 的使用者
class Solution(object): def poorPigs(self, buckets, minutesToDie, minutesToTest): """ :type buckets: int :type minutesToDie: int :type minutesToTest: int :rtype: int """ fold = minutesToTest / minutesToDie + 1 i = 0 # 注意這裡i從0開始 while buckets > pow(fold,i): i += 1 return i # 其實上面這段程式碼可以簡化成一句: import math return int(math.ceil(math.log(buckets,fold)))
結尾
解法1:https://blog.csdn.net/gleam_/article/details/80251769
解法竟是如此地一致,LeetCode上提交的思路都是這樣的,就是程式碼風格不同~