贪心算法(Greedy)
贪心算法本质上是求解问题的局部在最优解。核心是选取当前状态下最优的选择,主要操作是采用迭代的过程,根据局部最优策略,得到一部分解,缩小问题规模。
以455.分发饼干为例,
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
注意:
你可以假设胃口值为正。
一个小朋友最多只能拥有一块饼干。
1 | 示例 1: |
解释:
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。
1 | 示例 2: |
解释:
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.
我们来翻译一下问题:有两个正数数组:A和B。要使A里边的元素>=B里边的元素的个数最多。
我们来看贪心算法:
比如我们现在有数组A:[1,2,5,4]、B:[3,2,6,4]
思路上:选取当前状态下最优的选择即2能去满足2、5能满足3能满足4。5就去满足4而不是满足3。采用一种局部最优的状况。解决完2的问题就不在回溯再考虑2的问题只考虑2之外的问题。
操作上:采用迭代的过程,根据局部最优策略,得到一部分解,缩小问题规模即如何快速的去迭代和缩小问题规模。我们对数组A和数组B进行排序即A:[1,2,4,5]、B:[2,3,4,6]用最小的A(A[0])去满足最小的B(B[0]),如果满足缩小问题规模,考虑下一个A(A[1])、能不能满足下一个B(B[1])。如果不满足同样缩小问题规模,考虑下一个A(A[1])、能不能满足最小的B(B[0])。以此迭代逐步缩小问题规模之至A遍历完毕或者B遍历完毕。
引用 & 参考
https://zhuanlan.zhihu.com/p/53334049
https://www.zhihu.com/topic/20534085/intro