从今天开始就进入了贪心算法的板块了,感觉贪心算法思考起来比动态规划要简单一些,下面就和大家分享一下刚刷的这道题。
题目如下:
题意分析:
给定一些大小尺寸不同的 cookie 和一群贪心指数不同的小朋友,当小朋友获得了 cookie 的大小不小于自己贪心指数时,小孩将会变得很开心,请问给定的 cookie 最多能让几个小朋友开心?
方法一(贪婪算法)
先对 g、s 两个数组按照从大到小进行排序,然后先尝试拿最大的 cookie 给贪心指数最大的小朋友,看能否让其开心,若可以则让 res 加1,同理再拿下一个 cookie 去满足下一位小朋友;若当前 cookie 不能让当前小朋友开心,那么就用当前 cookie 去尝试满足下一位小朋友。当 cookie 分配完或者没有小朋友可以分配时,停止遍历并返回 res。
解题代码如下:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort( g.begin(), g.end(), greater<int>() );
sort( s.begin(), s.end(), greater<int>() );
int res = 0;
for ( int i = 0, j = 0; i < s.size() && j < g.size(); ) {
if ( s[i] >= g[j] ) {
res++;
i++;
j++;
}
else
j++;
}
return res;
}
};
提交后的结果如下:
方法二(方法一的优化)
由于是拿 cookie 去满足小孩,所以用了的 cookie 都应该是让小孩开心了的,所以 cookie 数就是开心的小孩个数,故用一个全局变量 i 去记录 cookie 数即可。
解题代码如下:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort( g.begin(), g.end(), greater<int>() );
sort( s.begin(), s.end(), greater<int>() );
int i = 0;
for ( int j = 0; i < s.size() && j < g.size(); j++ ) {
//由于是拿cookie去满足小孩,所以用了的cookie都应该是让小孩开心了的,所以cookie数就是开心的小孩个数
if ( s[i] >= g[j] ) i++;
}
return i;
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。