太久没有做过算法题了,今天开始进行“康复训练”。
455. Assign Cookies(easy)
题目描述
- 这道题的题意很简单,意思是说现在有孩子和饼干,你需要分饼干给孩子,其中每个孩子最多只能拿一个,每个孩子有不同的饥饿度,当孩子饥饿度小于饼干大小时,则可以把饼干分给他。
- 输入为两个数组,一个是孩子的饥饿度,另一个是饼干大小。输出是最多能满足的孩子数量。
策略
- 这题考虑贪心算法,首先满足饥饿度低的孩子,直到没有满足的饼干存在停止,这样可以尽可能保证剩下的饼干可以满足饥饿度更大的孩子。
这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。至于具体实现,因为我们需要获得大小关系,一个便捷的方法就是把孩子和饼干分别排序。这样我们就可以从饥饿度最小的孩子和大小最小的饼干出发,计算有多少个对子可以满足条件。
代码:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int child=0, cookie=0;
int g_size = g.size(), s_size = s.size();
while(child<g_size && cookie<s_size){
if(g[child]<=s[cookie]){
child++;
cookie++;
}else{
cookie++;
}
}
return child;
}
};
135. Candy(hard)
题目描述
- 这道题标签是hard,一开始以为会很难,但实际上发现还是蛮简单的,问题的大致意思是需要给站成一排的N个孩子发糖果,每个孩子都有一个评分。
- 规则是:
1、每个孩子至少发一个糖果
2、每个评分高比旁边高的的孩子需要比旁边的孩子获得的糖果多 - 输入是孩子的评分等级的数组,结果是最少的糖果数
策略
- 这题同样考虑贪心算法,首先第一个规则很简单,只需要初始化一个和评分数组一样的数组,将所有元素设置为1就可以了,然后研究第二个规则,我们只需要简单的两次遍历即可:把所有孩子的糖果数初始化为1;先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1。通过这两次遍历,分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。
代码:
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
if(size<2){
return size;
}
vector<int> ans(size,1);
for(int i=1; i<size; i++){
if(ratings[i] > ratings[i-1]){
ans[i] = ans[i-1]+1;
}
}
for(int i=size-1;i>0;i--){
if(ratings[i] < ratings[i-1]){
ans[i-1] = max(ans[i-1],ans[i]+1);
}
}
return accumulate(ans.begin(),ans.end(),0);
}
};
总结
今天是“康复训练”的第一天,写的过程中,可以发现遗忘的是真的快,也认识到了自己很菜,如果没有做一些题目的话,甚至都无从下手,只会解决一些简单的循环题,希望自己可以把LeetCode题继续刷下去吧,也不求每天做很多题,但希望可以每天都做一两道,以此为勉。