分发饼干(Assign Cookies (Easy))
1.题目描述
2.输入输出样例
3.解题思路
-
因为胃口值最小的孩子最容易满足,所以我们先考虑这个孩子。为了尽量使得剩下的饼干可以满足胃口值更大的孩子,所以我们应该把大于等于这个孩子胃口值的、且大小最小的饼干给这个孩子。满足了这个孩子之后,我们采取同样的策略,考虑剩下孩子里胃口值最小的孩子,直到没有满足条件的饼干存在。
-
简而言之,这里用到了贪心策略:给剩余的孩子里最小胃口值的孩子分配最小的能满足他的饼干,这样尽可能满足越多的孩子。
-
贪心算法和动态规划有什么区别:
- 动态规划必要两个性质:一,重叠子问题,二,最优子结构
- 贪心算法必要的两个性质:一,贪心选择性质,二,最优子结构
- 解释一下,最优子结构性质是指问题的最优解包含其子问题的最优解时,就称该问题具有最优子结构性质,重叠子问题指的是子问题可能被多次用到,多次计算,动态规划就是为了消除其重叠子问题而设计的。其实贪心算法是一种特殊的动态规划,由于其具有贪心选择性质,保证了子问题只会被计算一次,不会被多次计算,因此贪心算法其实是最简单的动态规划。
-
本题目中:贪心选择是每一次给剩余的孩子里最小胃口值的孩子分配最小的能满足他的饼干。
-
具体实现思路:
- 因为我们需要获得大小关系,一个便捷的方法就是把孩子和饼干分别排序。这样我们就可以从胃口值最小的孩子和大小最小的饼干出发,计算有多少个对子可以满足条件。
4.代码实现
public int findContentChildren(int[] g, int[] s) { //孩子和饼干排升序 Arrays.sort(g); Arrays.sort(s); int child = 0, cookie = 0; while (child < g.length && cookie < s.length) { if (g[child] <= s[cookie]) { child++; } cookie++; } return child; }