贪 心 算 法 ( greedy algorithm ) 就 是 这 样 的 算 法 , 它 在 每 一 步 都 做 出 当 时 看 起 来 最 佳 的选择。也就是说,它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。
(1)leetcode?455. 分发饼干
思路:首先将两个数组g 和 s进行排序
然后,优先满足饭量小的孩子
一种最简单的 方式就是先从胃口最小的孩子开始,拿最小的饼干试一下能不能满足他,如果能满足就 更好,如果不能满足,在找稍微大一点的,如果还不能满足就再找更大一点的
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int res = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
for(int i = 0; res < g.size()&& i < s.size(); i++)
{
if(s[i] >= g[res])
{
res++;
}
}
return res;
}
};
(2)leetcode?860. 柠檬水找零
顾 客 只 能 有 3 种 纸 币 , 5 元 , 10 元 , 20 元 。 我 们 要 统 计 5 元 和 10 元 的 数 量 , 20 元 的 不 需要统计,因为20元没法找给别人。 顾客给5元,5元的数量加1
顾客给10元,5元的数量减1(减完之后再判断5元的数量,如果小于0,说明5元的 不够了,没法给顾客找零了,直接返回false) 顾 客 给 20 元 , 根 据 生 活 常 识 , 如 果 有 10 元 的 , 应 该 先 找 他 10 元 的 , 然 后 再 找 他 一个5元的。如果没有10元的就找他3个5元的,然后再判断5元的数量,如果小于0直 接返回false。 ?
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0;
for(int i = 0; i < bills.size(); i++)
{
if(bills[i] == 5)
{
five++;
}
else if(bills[i] == 10)
{
ten++;
five--;
}
else if( ten > 0) //此时为20元 如果有10块先用10块
{
ten--;
five--;
}
else
{
five -=3;
}
if(five < 0) return false;
}
return true;
}
};
|