国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【貪心算法】:LeetCode860.檸檬水找零

這篇具有很好參考價(jià)值的文章主要介紹了【貪心算法】:LeetCode860.檸檬水找零。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

朋友們、伙計(jì)們,我們又見面了,本專欄是關(guān)于各種算法的解析,如果看完之后對你有一定的啟發(fā),那么請留下你的三連,祝大家心想事成!

C 語 言 專 欄:C語言:從入門到精通

數(shù)據(jù)結(jié)構(gòu)專欄:數(shù)據(jù)結(jié)構(gòu)

個(gè)? 人? 主? 頁?:stackY、

C + + 專 欄? ?:C++

Linux 專?欄? :Linux

【貪心算法】:LeetCode860.檸檬水找零,初階算法,c++,開發(fā)語言

目錄

1. 題目解析

2. 算法原理講解

3. 代碼實(shí)現(xiàn)

4. 貪心策略證明


1. 題目解析

LeetCode860.檸檬水找零:https://leetcode.cn/problems/lemonade-change/description/https://leetcode.cn/problems/lemonade-change/description/

860. 檸檬水找零

在檸檬水?dāng)偵?,每一杯檸檬水的售價(jià)為?5?美元。顧客排隊(duì)購買你的產(chǎn)品,(按賬單?bills?支付的順序)一次購買一杯。

每位顧客只買一杯檸檬水,然后向你付?5?美元、10?美元或?20?美元。你必須給每個(gè)顧客正確找零,也就是說凈交易是每位顧客向你支付?5?美元。

注意,一開始你手頭沒有任何零錢。

給你一個(gè)整數(shù)數(shù)組?bills?,其中?bills[i]?是第?i?位顧客付的賬。如果你能給每位顧客正確找零,返回?true?,否則返回?false?。

示例 1:

輸入:bills = [5,5,5,10,20]
輸出:true
解釋:
前 3 位顧客那里,我們按順序收取 3 張 5 美元的鈔票。
第 4 位顧客那里,我們收取一張 10 美元的鈔票,并返還 5 美元。
第 5 位顧客那里,我們找還一張 10 美元的鈔票和一張 5 美元的鈔票。
由于所有客戶都得到了正確的找零,所以我們輸出 true。

示例 2:

輸入:bills = [5,5,10,10,20]
輸出:false
解釋:
前 2 位顧客那里,我們按順序收取 2 張 5 美元的鈔票。
對于接下來的 2 位顧客,我們收取一張 10 美元的鈔票,然后返還 5 美元。
對于最后一位顧客,我們無法退回 15 美元,因?yàn)槲覀儸F(xiàn)在只有兩張 10 美元的鈔票。
由于不是每位顧客都得到了正確的找零,所以答案是 false。

提示:

  • 1 <= bills.length <= 105
  • bills[i]?不是?5?就是?10?或是?20?

根據(jù)題意:首先找零是按照順序來進(jìn)行的,不能“插隊(duì)”,并且剛開始我們身無分文。

假設(shè)第一個(gè)顧客給5塊,那么直接收下即可;

如果第一個(gè)顧客給的不是5塊,那表示需要給顧客找零,但是此時(shí)我們沒有錢,所以直接返回false即可。?

2. 算法原理講解

首先:我們根據(jù)顧客支付的錢可以分為三種情況:

1. 顧客支付5元 -> 直接收下即可;

2. 顧客支付10元 -> 直接收下,并且判斷身上是否有5元,如果有找零給顧客,如果沒有直接返回false;

3. 顧客支付20元 -> 直接收下,此時(shí)給顧客找零就存在兩種方法:

????????① 找給顧客一張10元和一張5元;

? ? ? ? ② 找給顧客三張5元;

那么該如何選擇上述兩種情況呢?

就需要用到貪心算法,那么到底該怎么貪才是最優(yōu)呢?

上面的兩種方法其本質(zhì)上就是一張10元與兩張5元的區(qū)別,那么根據(jù)貪心策略該怎么貪呢?

仔細(xì)觀察不難發(fā)現(xiàn),5元的用處是很大的,不僅可以給10元找零,還可以給20元找零,那么既然5元用處這么大,就表示5元比較珍貴,所以越珍貴的東西我們越舍不得用,所以盡量選擇找零5元比較少的那一個(gè)方法,所以我們的貪心策略是:盡可能少的使用5元錢給顧客找零。

【貪心算法】:LeetCode860.檸檬水找零,初階算法,c++,開發(fā)語言

3. 代碼實(shí)現(xiàn)

怎么記錄我們手上的錢呢?

可以使用兩個(gè)變量來統(tǒng)計(jì)此時(shí)我們手中所具有的5元錢的張數(shù)(cnt_five)和10元錢cnt_ten),然后遍歷bills,遇到5元將cnt_five++,遇到10元錢先看自己手里有沒有錢,遇到20元首先考慮的就是10+5的策略,再考慮5+5+5的策略。

class Solution 
{
public:
    bool lemonadeChange(vector<int>& bills) 
    {
        //統(tǒng)計(jì)5元錢和10元錢的張數(shù)
        int cnt_ten = 0, cnt_five = 0; 
        //遍歷
        for(auto& e : bills)
        {
            if(e == 5) cnt_five++;   //遇到5元就收下
            else if(e == 10)         //遇到10元
            {
                cnt_ten++;
                if(cnt_five) cnt_five--; //先判斷是否可以找零
                else return false;
            }
            else                     //遇到20元
            {
                if(cnt_five && cnt_ten) //先考慮10+5的策略
                {
                    cnt_five--;
                    cnt_ten--;
                }
                else if(cnt_five >= 3) cnt_five -= 3; //再考慮5+5+5的策略
                else return false;
            }
        }
        //走到這里就說明找零成功
        return true;
    }
};

4. 貪心策略證明

那么如果證明我們選擇的這種貪心策略是否正確呢?

需要用到:交換論證法

例如:

假設(shè)貪心解為 [a, b, c, d, e, f]

假設(shè)最優(yōu)解為 [e, b, c, d, a, f]

交換論證就是在不破壞最優(yōu)解的“最優(yōu)性質(zhì)”的前提下可以通過一定的調(diào)整將最優(yōu)解轉(zhuǎn)化為貪心解即可

將最優(yōu)解里面的e和a交換,這樣既沒有破壞最優(yōu)解性質(zhì),同樣也可以將最優(yōu)解轉(zhuǎn)化為貪心解,則表示該貪心策略正確。

【貪心算法】:LeetCode860.檸檬水找零,初階算法,c++,開發(fā)語言

在本題中使用交換論證法:遇到顧客給20元,貪心解是用10元和5元進(jìn)行找零,最優(yōu)解是用三張5元進(jìn)行找零,區(qū)別就在于兩張5元和一張10元。

顧客? ? ? ? ?...? 5? ?10? ?20? ? ? ? 10? ...

貪心解? ? ?...? 0? ? 5? ?10+5? ? ? 5? ...

最優(yōu)解? ? ?...? 0? ? 5? ? 5+5+5? ?5? ...

那么在整個(gè)找零過程中,最優(yōu)解的10元存在花與不花兩種情況:

① 如果在前面或者后面的找零過程中,將10元錢花了,那么在后面花的10元錢可以將這里的5+5給替換掉,此時(shí)也就變成了貪心解;

② 如果在前面或者后面的找零過程中,沒有將10錢花掉,那么就可以用沒花掉的10元錢替換掉這里的5+5,此時(shí)也變成了貪心解。

所以通過交換論證法證明了最優(yōu)解可以在不改變最優(yōu)條件的性質(zhì)下變成貪心解,所以證明我們的貪心策略(選擇花費(fèi)5元較少的一種方法)是正確的。

朋友們、伙計(jì)們,美好的時(shí)光總是短暫的,我們本期的的分享就到此結(jié)束,欲知后事如何,請聽下回分解~,最后看完別忘了留下你們彌足珍貴的三連喔,感謝大家的支持!??????文章來源地址http://www.zghlxwxcb.cn/news/detail-833222.html

到了這里,關(guān)于【貪心算法】:LeetCode860.檸檬水找零的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 貪心算法在找零問題中的應(yīng)用

    貪心算法在找零問題中的應(yīng)用

    找零問題是一個(gè)經(jīng)典的優(yōu)化問題,其目標(biāo)是用最少的硬幣找零給定的金額。貪心算法是解決這類問題的一種常用方法,其核心思想是在每一步選擇中都采取最好或最優(yōu)(即最有利)的選擇,從而希望能夠?qū)е氯值淖詈没蜃顑?yōu)的解。在找零問題中,貪心算法的策略通常是根據(jù)

    2024年04月23日
    瀏覽(17)
  • 算法沉淀——貪心算法五(leetcode真題剖析)

    算法沉淀——貪心算法五(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/jump-game-ii/ 給定一個(gè)長度為 n 的 0 索引 整數(shù)數(shù)組 nums 。初始位置為 nums[0] 。 每個(gè)元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處: 0 = j = nums[i] i + j n 返回到達(dá) nums[n - 1] 的最小跳躍次

    2024年04月11日
    瀏覽(23)
  • 算法沉淀——貪心算法六(leetcode真題剖析)

    算法沉淀——貪心算法六(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/broken-calculator/ 在顯示著數(shù)字 startValue 的壞計(jì)算器上,我們可以執(zhí)行以下兩種操作: **雙倍(Double):**將顯示屏上的數(shù)字乘 2; **遞減(Decrement):**將顯示屏上的數(shù)字減 1 。 給定兩個(gè)整數(shù) startValue 和 target 。返回顯示數(shù)字 target 所需的最小操

    2024年04月11日
    瀏覽(45)
  • 算法沉淀——貪心算法三(leetcode真題剖析)

    算法沉淀——貪心算法三(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 給你一個(gè)整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價(jià)格。 在每一天,你可以決定是否購買和/或出售股票。你在任何時(shí)候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。 返回 你能獲得

    2024年03月24日
    瀏覽(20)
  • 算法沉淀——貪心算法七(leetcode真題剖析)

    算法沉淀——貪心算法七(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/integer-replacement/ 給定一個(gè)正整數(shù) n ,你可以做如下操作: 如果 n 是偶數(shù),則用 n / 2 替換 n 。 如果 n 是奇數(shù),則可以用 n + 1 或 n - 1 替換 n 。 返回 n 變?yōu)?1 所需的 最小替換次數(shù) 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 這里我們

    2024年03月23日
    瀏覽(24)
  • 算法沉淀——貪心算法一(leetcode真題剖析)

    算法沉淀——貪心算法一(leetcode真題剖析)

    貪心算法(Greedy Algorithm)是一種基于貪心策略的優(yōu)化算法,它通常用于求解最優(yōu)化問題,每一步都選擇當(dāng)前狀態(tài)下的最優(yōu)解,以期望通過局部最優(yōu)的選擇最終達(dá)到全局最優(yōu)。貪心算法的思想是在每一步都做出在當(dāng)前狀態(tài)下局部最優(yōu)的選擇,而不考慮未來可能造成的影響。 在

    2024年03月08日
    瀏覽(17)
  • 算法沉淀——貪心算法二(leetcode真題剖析)

    算法沉淀——貪心算法二(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/longest-increasing-subsequence/ 給你一個(gè)整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示

    2024年03月19日
    瀏覽(68)
  • 【貪心算法】leetcode刷題

    【貪心算法】leetcode刷題

    貪心算法無固定套路。 核心思想:先找局部最優(yōu),再擴(kuò)展到全局最優(yōu)。 兩種思路: 1、從大到小。局部最優(yōu)就是大餅干喂給胃口大的,充分利用餅干尺寸喂飽一個(gè),全局最優(yōu)就是喂飽盡可能多的小孩。 先遍歷的胃口,在遍歷的餅干 2、從小到大。 小餅干先喂飽小胃口 。兩個(gè)

    2024年02月14日
    瀏覽(24)
  • leetcode系列貪心算法匯總

    11 盛水最多的容器 題目:給一個(gè)一維數(shù)組,大概的意思就是下標(biāo)代表水槽的寬度,數(shù)組的值代表這個(gè)位置水槽的高度,求盛水最多的容量。 解析:肯定得有個(gè)臨時(shí)變量來存最大值,且不斷進(jìn)行比較來更新最大值,然后分別從兩邊開始使用雙指針進(jìn)行遍歷,tmp := (right - left)

    2024年02月07日
    瀏覽(15)
  • 【leetcode】貪心算法介紹

    詳細(xì)且全面地分析貪心算法常用的解題套路、數(shù)據(jù)結(jié)構(gòu)和代碼邏輯如下: 找最值型: 每一步選擇都是局部最優(yōu)解,最后得到的結(jié)果就是全局最優(yōu)解。 常用于找零錢問題、區(qū)間覆蓋問題等。 一般情況下,可以通過排序?qū)?shù)據(jù)進(jìn)行處理,然后逐步選擇最優(yōu)解。 區(qū)間問題: 將問

    2024年02月21日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包