文章目录
一、对贪心算法的理解
- 贪心算法是最接近人类智慧的算法,贪心算法的思想是每次都贪图局部最优,从而得到一个全局最优解。作为一个新时代中国青年,我们懂得,如果总是贪图眼前最优,最后并不一定能够得到全局最优。所以,贪心算法也具有其局限性,部分问题通过贪心算法得到的并不是最优解。
- 既然不是所有的问题都可以通过贪心算法来解决,那么我们又如何判断贪心算法是否适用于某一道算法题呢?其实,我们很难在算法笔试有限的时间内,通过数学证明某种贪心算法策略是否能够得到全局最优。因此,我们退而求其次,用算法题的暴力解法来验证贪心策略是否正确。
二、贪心算法的常见套路
对于有传递性的数据,通常情况下我们可以通过排序
或建堆
来解决。
三、经典题目及详解
3.1 分发饼干
题意
题解
int findContentChildren(vector<int>& g, vector<int>& s) {
// 存在数组为空直接返回0
if (g.size() == 0 || s.size() == 0) {
return 0;
}
// 对存放孩子胃口值和饼干尺寸的两个数组分别进行升序排序
sort(g.begin(), g.end());
sort(s.begin(), s.end());
// 胃口值数组索引变量、饼干尺寸数组索引变量、最终返回值变量
int gi = 0, si = 0, res = 0;
// 遍历升序排序后的数组,有数组超出边界则结束循环
while (gi < g.size() && si < s.size()) {
if (s[si] >= g[gi]) {
// 若当前饼干大于当前胃口值,则返回值加1,且两个数组的指针都往后移动
res ++;
si ++;
gi ++;
} else {
// 若当前饼干小于当前胃口值,则饼干尺寸数组索引向后移动寻找更大的饼干
si ++;
}
}
return res;
}