目录
看的书自学 《高畅Leetcode刷题》 过程很痛苦 不建议学习 不会的地方没有解答之处 到处查找很困扰 浪费时间
错误的地方欢迎大家相互交流 能改正最好啦 蟹蟹
贪心算法就是啥都想要,从局部最优解达到全局最优解,前提,局部最优解结果互不干扰
做题时可以考虑遍历,选择,排序
以下试题用到的头文件和命名空间
#include <vector>
#include <algorithm>
#include <numeric>
#include <deque>using namespace std;
455 孩子分饼干
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。
每个孩子只能吃一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。
求解最多有多少孩子可以吃饱。
解:1.饥饿度最小的孩子最容易吃饱。
2.饥饿度和饼干大小排序,方便查找
3.贪心算法,寻找局部最优解,最后全局最优解,局部结果互不干扰
书中最优解
int algorithm::findCountChildren(vector<int>& children, vector<int>& cookies)
{
sort(children.begin(), children.end());
sort(cookies.begin(), cookies.end());
int child = 0, cookie = 0;
while (child < children.size() && cookie < cookies.size()) {
if (children[child] <= cookies[cookie]) ++child;
++cookie;
}
return child;
}
135 孩子发糖果
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,
规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;
所有孩子至少要有一个糖果。求解最少需要多少个糖果。
解:1.每个孩子一个糖果
2.从左往右遍历,右边的分数比左边的高,给右边的再给一个糖果
从右往左遍历,左边的分数比右边的高,左边糖果比右边少就在右边基础上加一
书中最优解
int algorithm::candy(vector<int>& ratings)
{
int size = ratings.size();
vector<int> num(size, 1);
if (size < 2) {
return size;
}
for (int i = 1; i < size; ++i) {
if (ratings[i] > ratings[i - 1]) {
num[i] = num[i - 1] + 1;
}
}
for (int i = size - 1; i > 0; --i) {
if (ratings[i] < ratings[i - 1]) {
num[i - 1] = max(num[i - 1], num[i] + 1);
//用于比较两个值并返回较大的那个,在头文件<algorithm>中
//max_element函数在整数向量中找到最大值
}
}
return accumulate(num.begin(), num.end(), 0);
//accumulate(起始迭代器, 结束迭代器, 初始值, 自定义操作函数)
// 函数共有四个参数,其中前三个为必须,第四个为非必需。若不指定第四个参数,
// 则默认对范围内的元素进行累加操作。
// 也可以拼接字符串
//在头文件<numeric>中,包括乘除
}
435 消除重叠区间
给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠
解:1.取区间的头和尾组成数组排序
2.判断区间是否相交
3