原题地址

0701.png0702.png

贪心算法的入门级题目

本题思路很简单,那就是给一个孩子的饼干应该尽量小并且又能满足该孩子

这也就是贪心算法。局部得到最优解从而使全局最优。

那么重点来了,我们怎么证明在这道题中,局部最优能够推出全局最优呢?换种说法,我们怎么知道贪心策略适用于这道题目?

反证法

  • 假设饼干从小到大排列。在某次选择中,贪心算法选择给当前满足度最小的孩子分配第m块饼干,所以第m块饼干是满足该孩子的最小饼干,是当前最优的。
  • 现在我们来反证。假设存在一种最优策略比贪心策略更好,给孩子分配的是第n块饼干,n > m,那么这次分配完毕后,显然使用贪心策略剩下的饼干要比最优策略更大,因此在后续的分配中,贪心策略更能满足更多的孩子,所以最优策略不如贪心策略,矛盾
  • 因此,贪心策略是最优策略。

算法思路

先将两数组从小到大排序,采用双指针进行遍历。

python代码

  1. def findContentChildren(self, g: List[int], s: List[int]) -> int:
  2. g.sort()
  3. s.sort()
  4. p = q = 0
  5. while p < len(g) and q < len(s):
  6. if s[q] >= g[p]:
  7. p += 1
  8. q += 1
  9. return p