什么是贪心算法
就是通过局部最优来得到全局最优,好比AB一起吃自助餐,最优的就是A吃到最大量,B也吃到最大量,都是局部最优,进而得到全局最优。且二者的局部最优互不影响。
455.分发饼干
题目
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子
i
,都有一个胃口值g[i]
,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j
,都有一个尺寸s[j]
。如果s[j] >= g[i]
,我们可以将这个饼干j
分配给孩子i
,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例 1:
输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。示例 2:
输入: g = [1,2], s = [1,2,3] 输出: 2 解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.提示:
1 <= g.length <= 3 * 104
0 <= s.length <= 3 * 104
1 <= g[i], s[j] <=
题解
用贪心算法就很好解决。首先有孩子数量以及每个孩子需要吃饱的列表以及饼干大小的列表。
为了满足更多的小孩,可以让容易吃饱的小孩先吃饱,这样子可以使得更多的小孩吃饱。
先进行排序,利用sort函数对小孩数组和饼干数组都排序。接着按顺序让小孩需要吃的大小与饼干有的大小进行比较,选择大于等于该小孩需要的量的饼干中最小的那一块。
这里可以使用一个while来进行判断,当所有小孩都吃到饼干或者一块饼干已经不够小孩吃了,则结束循环。(这里要注意,因为题意中说的是一个小孩最多只能吃一块饼干,就可以这样子判断。)
class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(),g.end()); sort(s.begin(),s.end()); int child=0; int cookies=0; while(child<g.size() && cookies<s.size()){ if(g[child]<=s[cookies]) child++; cookies++; } return child; } };
135.分发糖果
题目
n
个孩子站成一排。给你一个整数数组ratings
表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。- 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
示例 1:
输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2:
输入:ratings = [1,2,2] 输出:4 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。提示:
n == ratings.length
1 <= n <= 2 *
0 <= ratings[i] <= 2 *
题解
分析这个问题,每个孩子都至少获得一个糖果,可以先申请一个数组,并且赋值为1.接着是相邻的两个孩子,分高的孩子获得多一点的糖果。
那可以这样子,从左往右发糖果,如果右边的孩子比左边的孩子分高,那么就比左边多给一颗糖果。但是这种情况下,可能会出现左边的小孩比右边的分高。那就倒过来进行比较,如果左边的孩子分比右边的高,如果糖果少于或者等于右边的孩子,则左边孩子得到的糖果数为右边孩子糖果数加一。这里要注意等于。为什么等于的情况下,左边的孩子得到的糖果要高于右边的孩子呢?这里可以参考示例2。
class Solution {
public:
int candy(vector<int>& ratings) {
int size=ratings.size();
if(size<2)
return size;
vector<int> num(size,1);
int i;
for(i=1;i<size;i++){
if(ratings[i-1]<ratings[i])
num[i]=num[i-1]+1;
}
for(i=size-1;i>0;i--){
if(ratings[i]<ratings[i-1] && num[i]>=num[i-1])
num[i-1]=num[i]+1;
}
int sum=0;
for(i=0;i<size;i++)
sum+=num[i];
return sum;
}
};