455. | 貪心算法 LeetCode

分析:
? 貪心思想的核心是每一步只考慮當(dāng)前的最優(yōu)解,這些最優(yōu)解構(gòu)成最終問題的解。與動(dòng)態(tài)規(guī)劃不容,當(dāng)前的最優(yōu)解是獨(dú)立的,與上下文無關(guān)。所以貪心算法需要滿足其最優(yōu)解能夠由其子問題的最優(yōu)解組成,也就是該問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。
? 具體到這一題。首先,小孩之間的饑餓感互不影響,一個(gè)人飽了其他人不會跟著變飽,其子問題是獨(dú)立的。其次,每一次只要用最小的餅干喂飽胃口最小的那個(gè)小孩(子最優(yōu)解),就能喂飽最多小孩,即問題的最優(yōu)解。
? 這里,可以用數(shù)學(xué)歸納法來證明貪心算法對該題有效。(不嚴(yán)謹(jǐn)證明,有錯(cuò)的話可以指正)
當(dāng)child = 1, cookie = 1時(shí),顯然結(jié)論成立。
假設(shè)當(dāng)child=1,2,...,n,? cookie=1,2,...,m時(shí),結(jié)論也成立。則當(dāng)child = 1,2,...,n,n+1, cookie=1,2,...,m,m+1時(shí),若拿m+1餅干去喂n+1之前的小孩k,則n+1小孩一定無法喂飽,也就是比m+1喂n+1的結(jié)果小,反證了對n+1,m+1的情況,該結(jié)論也成立。
即對該問題,每一次只要用最小的餅干喂飽胃口最小的那個(gè)小孩,就能喂飽最多小孩。
? 因此,我們需要先對兩個(gè)數(shù)組進(jìn)行排序,然后依次喂飽小孩,直到所有餅干都喂完或沒有滿足的餅干為止。


標(biāo)簽: