專欄 | 九章算法
網址 | www.jiuzhang.comgit
題目描述程序員
假設你有一羣孩子和一些餅乾,每一塊餅乾j大小爲s(j),同時每個孩子i,被分到的餅乾大小至少爲g(i),即s(j)>=g(i)時,這個孩子纔會知足,g(i)成爲孩子i的知足度。你的目標是將餅乾分配給孩子,使獲得知足的孩子儘量多。保證每一個g(i)爲正且不能將多塊餅乾分給一個孩子或將一塊餅乾分給多個孩子。面試
輸出樣例算法
樣例1:
輸入: [1,2,3], [1,1]
輸出: 1
說明: 三個孩子的知足度分別爲1,2,3,兩塊餅乾的大小均爲1。餅乾的大小爲1,只能知足第一個孩子,因此輸出1。微信
樣例2:
輸入: [1,2], [1,2,3]
輸出: 2
說明: 兩個孩子的知足度分別爲1,2,三塊餅乾的大小分別爲1,2,3。這三塊餅乾的大小足以知足這兩個孩子,因此輸出2。框架
解題思路分析學習
1. 分析
直覺上,要使知足的孩子儘量多,分配給每一個孩子的餅乾應該儘量小。若是把大的餅乾分配給知足度較小的孩子,顯然會形成浪費。這樣,咱們能夠按g(i)從小到大給孩子分配餅乾,同時,爲了避免浪費餅乾,對於要分配給某個孩子的餅乾,也從剩下的餅乾中找到最小的能知足這個孩子的餅乾。按g(i)從小到大分配餅乾的好處是,當把s(j)分配給g(i)以後,對於下一個孩子g(i+1),咱們就不用考慮s(j)以前的餅乾了,只需考慮s(j)以後的餅乾(這裏假設g(i),s(i)爲從小到大排列)。由於,若是s(j)以前還有能夠知足g(i+1)的餅乾,那這塊餅乾也必然能夠知足g(i),那s(j)就不是剩餘餅乾中能夠知足g(i)的最小的餅乾了。ui
2. 實現
將g與s都從小到大排列,再用兩根指針i,j,若是g(i)<=s(j),則將s(j)分配給g(i),再看下一個孩子與下一塊餅乾,i與j均自增;不然,應依次增大j去尋找能知足g(i)的s(j)。這種方法叫作two pointer。設孩子數與餅乾數的較大值爲n,則排序的時間複雜度爲O(nlog(n)),兩根指針的時間的複雜度爲O(n),總的時間複雜度爲O(nlog(n))。指針
3.證實
那麼這樣的貪心算法是正確的嗎?是的。下面給出簡單的分析。首先仍然假設g(i)已從小到大排序,因此g(0)爲最小值。對於一個最優的方案(即能知足最多孩子的方案),假設這個方案裏能知足的孩子中知足度最小的是g(i),而將s(j)分配給了g(i),那麼有s(j)>=g(i)>=g(0),故咱們能夠把g(i)換成g(0)而獲得另外一個最優方案。把g(0)與s(j)從原問題中去掉,則獲得了一個比原問題規模略小但形式相同的新問題。對於新問題的分析與原問題相同。這樣,咱們就能夠把原最優方案中的孩子依次替換成g(0),g(1),……,g(ans-1),ans爲最優方案知足的孩子個數。所以,咱們總能夠去先知足知足度最小的孩子來得到最優方案。code
4.實現
只要每次給出的餅乾是能知足當前的孩子的最小的餅乾,以什麼樣的順序給孩子分配餅乾實際上是無所謂的(若是不存在能知足當前孩子的餅乾,則跳過這個孩子),最終的答案都是同樣的。具體分析比較繁瑣,這裏再也不給出,感興趣的讀者能夠試着從如下角度分析:對於一種孩子分配順序,若是交換某對相鄰兩個孩子的順序,會對最終結果形成怎樣的影響。
5.Follow up
若是能夠把多塊餅乾分給一個孩子,怎麼作?
參考程序
面試官角度分析
此題的最優算法是貪心算法。若是能想到貪心算法並給出算法框架,就能夠達到hire的程度。對於貪心算法的學習,能夠參考的意見 以下 link:
還在浪費時間學貪心算法麼?告訴你三個不須要學習貪心法的理由!
LintCode相關問題
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
九章官網參考代碼連接:
www.jiuzhang.com/solutions/m…
www.jiuzhang.com/solutions/c…
www.jiuzhang.com/solutions/j…
www.jiuzhang.com/solutions/j…
www.jiuzhang.com/solutions/g…
www.jiuzhang.com/solutions/d…
www.jiuzhang.com/solutions/l…
www.jiuzhang.com/solutions/l…
推薦閱讀: