接著之前的雞蛋掉落問題,我們再來一道經典的演算法題好了,也算是溫故而知新。
而且講道理這些題目真心還是蠻有意思的,不是那種純粹的就是練習熟練度,而是真的需要去鍛鍊看問題的方式。
這次我們來看看不幸的豬這道題,它在leetcode當中同樣有收錄,對應第458題。
給出leetcode當中的題目描述如下:
有 buckets 桶液體,其中 正好 有一桶含有毒藥,其餘裝的都是水。它們從外**起來都一樣。為了弄清楚哪只水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷。不幸的是,你只有 minutestotest 分鐘時間來確定哪桶液體是有毒的。
餵豬的規則如下:
1. 選擇若干活豬進行餵養
2. 可以允許小豬同時飲用任意數量的桶中的水,並且該過程不需要時間。
3. 小豬喝完水後,必須有 minutestodie 分鐘的冷卻時間。在這段時間裡,你只能觀察,而不允許繼續餵豬。
4. 過了 minutestodie 分鐘後,所有喝到毒藥的豬都會死去,其他所有豬都會活下來。
5. 重複這一過程,直到時間用完。
給你桶的數目 buckets ,minutestodie 和 minutestotest ,返回在規定時間內判斷哪個桶有毒所需的最小豬數。
這一題考察的是其實是k進製,如果你能想到這一點,那麼這一題就是可以直接解析求解的。
假設在給定的測試時間內可以做n輪實驗。那麼,對於任意乙隻豬,事實上它可以有i+1種狀態表示,分別為剛好在第i
ii次死亡(i
=1...
ni=1...n
i=1...
n)或者最終存活。
所以,我們只需要將總的水桶數用n+1
n+1n+
1進製進行表達,那麼,它的位數即是最終我們所需要的最少的豬的個數。
特別的,當n=1
n=1n=
1時,問題就退化成了最簡單的二進位制問題。
我們直接給出python**實現如下:
class
solution
:def
poorpigs
(self, buckets:
int, minutestodie:
int, minutestotest:
int)
->
int:
k = minutestotest // minutestodie +
1return math.ceil(math.log(buckets)
/ math.log(k)
)
提交**評測得到:耗時28ms,擊敗了98.28%的提交的結果。
這個題目算是少數幾道我實際在面試中遇到過的題目,可惜當時沒能想清楚,糾結於二進位制而沒有往外多走一步擴充套件到k進製,可惜了,不過現在想想,確實是一道非常有意思的題目,這次就寫在這裡,與君共勉吧。
經典的演算法
下面是一些比較重要的演算法,原文 羅 列了32個,但我覺得有很多是數論裡的,和計算機的不相干,所以沒有選取。下面的這些,有的我們經常在用,有的基本不用。有的很常見,有的很偏。不過了解 一下也是好事。也歡迎你留下你覺得有意義的演算法。注 本篇文章並非翻譯,其中的演算法描述大部份摘自wikipedia,...
經典排序演算法的經典問題
問題描述 乙個陣列只含有三種元素 0,1,2,不使用計數排序,將0放在1的左邊,2放在1的右邊。分析 1.可借鑑快排中劃分的思想。將陣列分為,arr,2.遍歷arr,當發現0時,0區向右擴,發現2時,2區向左擴,3.當前元素進入2區時,結束。vector sortthreecolor vector ...
《知識分子的不幸》摘錄
這篇雜文中我最感動的莫過於下面這一段話,真心摘錄下來分享給大家 作為乙個知識分子,我對信念的看法是 人活在世上,自會形成信念。對我本人來說,學習自然科學 閱讀文學作品 看人文科學的書籍,乃至旅行 戀愛,無不有助於形成我的信念,構造我的價值觀。一種學問 一本書,假如不對我的價值觀發生作用 姑不論其大小...