理论基础
贪心算法是没有规律的,解题过程基本就是模拟,其整体的解题思想就是将一个大问题拆解成一个个小问题,当对每一个小问题都求出最优解后,其整体一个大问题就得到了最优解。
基本贪心的题目要么特简单,要么死活想不出来,所以也不用花心思去研究其规律,没有思路就立刻看题解。
学完贪心之后再去看动态规划,就会了解贪心和动规的区别。
分发饼干
题目详细:LeetCode.455
这道题比较简单,思路讲起来也比较口语化。
要想饼干尽可能的满足更多数量的孩子,那么只要将孩子的胃口和饼干的大小进行排序,然后从胃口小的孩子开始分发饼干,使他们都能够用尽可能小的饼干就满足了胃口,接着统计分发过程中满足的孩子数量即可。
所以回到贪心算法的思想上来讲:
- 局部最优:尽可能小的饼干能够满足胃口尽可能小的孩子,满足则数量 + 1
- 整体最优:所有的饼干都能够尽可能的满足孩子的胃口,统计满足的数量
Java解法(贪心,模拟):
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int g_index = 0, s_index = 0, count = 0;
while(g_index < g.length && s_index < s.length){
if(g[g_index] <= s[s_index]){
count++;
g_index++;
}
s_index++;
}
return count;
}
}
摆动序列
题目详细:LeetCode.376
这道题在做题的时候,与其说是贪心算法,不如说是一道模拟题,详细的题解可查阅:《代码随想录》— 摆动序列
主要的难点在于判断数字是否摆动,有三种情况:
- 情况一:数组首尾两端
- 情况二:上下坡中有平坡
- 情况三:单调坡中有平坡
对于情况一:
- 题目默认数组首位两端为顶点
- 所以即使数组长度为1,其摆动序列长度也最小为1
- 那么我们只需要在计算出摆动的总次数 + 1,即可得到摆动序列的最大长度,这里我初始化总次数变量 count = 1,效果也是