专题复习:贪心算法

贪 心 算 法 ( 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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值