LeetCode刷题 -- 贪心(一)

目录

  • 柠檬水找零
    • 题目解析
    • 算法原理
    • 代码
    • 证明方法

柠檬水找零

题目链接

题目解析

柠檬水5块一杯(如果顾客给你5块你就收下)
顾客是排队来购买的(只能按顺序找零)
并且最开始你手里是没有钱的

LeetCode刷题 -- 贪心(一)_第1张图片

算法原理

1. 给5块钱,收下
2. 给10块钱 ,找5块钱或者没有5块钱可找
3. 给20块钱,优先考虑找5块钱和10块钱,这种最优,因为5块钱是最有用的,比如[20,10] 你现在有三个5块,1个10块,
<>第一种找5,5,5第二次就没法找了
<>第二种找10,5第二次还可以找5块钱
再考虑5,5,5这种
或者无法找零返回false
LeetCode刷题 -- 贪心(一)_第2张图片

代码

 class Solution 
{
public:
    bool lemonadeChange(vector<int>& bills) 
    {
       // 分情况讨论 贪心
       // 5 10 20
       int five = 0,ten = 0;
       for(auto x : bills)
       {
         if(x == 5) five++;
         else if(x == 10) 
         {
            if(five == 0) return false;
            else if(five >= 1) five--;
            ten++;
         }
         else 
         {
            if(five && ten)// 贪心
            {
                five--;
                ten--;
            }
            else if(ten == 0&&five >= 3)
            {
                five -= 3;
            }
            else return false;
         }
       }
       return true;
    }
};

证明方法

交换论证法:在保证最优解正确性的情况下,把最优解转化为贪心解
比如20块钱,10和5 5,5,5 两种处理思路
贪心解:10 + 5 …
最优解:5 + 5 + 5 …
第一种后面不需要用到10块钱,可以把最优解的两个5块替换为10块钱
第二种后面需要用到10块钱,可以把后面的10块钱和两个5块钱交换
依次遍历这样交换
两种情况都把最优解转换成了贪心解了
LeetCode刷题 -- 贪心(一)_第3张图片

你可能感兴趣的:(题解,leetcode,算法,职场和发展)