最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python零錢兌換的實(shí)現(xiàn)代碼

 更新時(shí)間:2022年05月09日 11:20:21   作者:亖夕  
假如有這樣一個(gè)問題給你一個(gè)整數(shù)數(shù)組?coins?,表示不同面額的硬幣以及一個(gè)整數(shù)?amount?,表示總金額,計(jì)算并返回可以湊成總金額所需的最少的硬幣個(gè)數(shù),接下來通過示例代碼給大家介紹Python零錢兌換問題,感興趣的朋友一起看看吧

題目:

給你一個(gè)整數(shù)數(shù)組 coins ,表示不同面額的硬幣;以及一個(gè)整數(shù) amount ,表示總金額。

計(jì)算并返回可以湊成總金額所需的 最少的硬幣個(gè)數(shù) 。如果沒有任何一種硬幣組合能組成總金額,返回 -1 。你可以認(rèn)為每種硬幣的數(shù)量是無限的。

示例 1:

輸入:coins = [1, 2, 5], amount = 11

輸出:3

解釋說明:11 = 5 + 5 + 1

示例 2:

輸入:coins = [2], amount = 3

輸出:-1

解釋說明:硬幣無法湊成金額-1

示例 3:

輸入:coins = [1], amount = 0

輸出:0

題目分析:

題目要求用最少的硬幣個(gè)數(shù)湊出總金額amount。我們第一感覺可能是使用暴力或者遞歸解題,對這道題使用暴力解題,計(jì)算出所有可能的結(jié)果后取硬幣數(shù)最小值,時(shí)間復(fù)雜度妥妥O(n^3),算是很慢的解題方式了,下面我們介紹遞歸解法和玄學(xué)位運(yùn)算解法(使用到位運(yùn)算解法的解題效率一半很高,但是很難想到,所以我愿稱之為“玄學(xué)”)

解題思路:

解法一:遞歸

使用動態(tài)規(guī)劃五部曲

1.分析確定dp數(shù)組以及其下標(biāo)的含義或狀態(tài)分析

我們規(guī)定dp[i]表示湊足總額為  i  所需錢幣的最少個(gè)數(shù)。

2.確定遞推公式 

我們考慮dp[i]的來源,因?yàn)閐p[i]的來源為dp[i - coins[i]] + 1,(coins[i]表示coins中的第i枚硬幣),這也是dp[i]的唯一來源。

那為什么要+1呢?

這里我們明確dp[i - coins[i]]是湊夠金額 i - coin[i]的最少硬幣個(gè)數(shù)。那么當(dāng)金額i - coin[i]變到 i 時(shí),意味著我們在coins中拿了一枚硬幣coins[i],那么從dp[i - coin[i]] 到 dp[i]需要加上所取得那枚硬幣,即+1.

分析到dp[i]狀態(tài)及前面得狀態(tài),dp[i]即為最優(yōu)解。

---------------------------------------

coins = [1, 2, 3]   amount = 5

那么在 1+1+1+1+1 = 5, 1+2+1+1 = 5, 2+2+1 = 5....等情況中

dp[5]最優(yōu)解必為2+2+1 = 5

即dp[5] = dp[5 - coins[0]] + 1 

而dp[5 - coins[0]] = dp[4] = dp[4 - coins[1]] + 1

以此類推

------------------------------------------

我們要取最優(yōu)解(硬幣數(shù)最少)也就是取dp[i - coins[i]] + 1最小值

即遞推公式為:dp[i] = min(dp[i - coins[i]] + 1, dp[i])

(括號中得dp[i]為上一狀態(tài)的dp[i])

3.如何初始化dp數(shù)組

我們分析公式的基礎(chǔ),可得公式基礎(chǔ)為dp[0]即湊足總額為  0  所需錢幣的最少個(gè)數(shù)。接著考慮到其他dp列表其他下標(biāo)的初始化,由于遞推公式使用了min(),那么為了不讓初始化影響遞推結(jié)果,我們需要將dp[i](i != 0)初始化為一個(gè)很大的數(shù),如正無窮‘inf’。

4.確定遍歷的順序

題目要求的是找到最小硬幣個(gè)數(shù),所以遍歷coins或者先遍歷尋找amount列表無關(guān)緊要。

5.舉例驗(yàn)證推導(dǎo)的dp數(shù)組(公式)是否正確

可以帶入一個(gè)簡單以的例子,比如例1.

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

def coinChange(coins, amount):
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0
    for coin in coins:
        for i in range(coin, amount + 1):
            dp[i] = min(dp[i], dp[i - coin] + 1)
    return dp[amount] if dp[amount] != float('inf') else -1

代碼注釋

def coinChange(coins, amount):
    # 初始化dp列表
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0  # 初始化遞推公式基礎(chǔ)
    for coin in coins:   # 遍歷硬幣
        # 遍歷尋找構(gòu)成amount最優(yōu)解
        for i in range(coin, amount + 1):  
            dp[i] = min(dp[i], dp[i - coin] + 1)
    # 如果最終沒有找到湊成amount金額的硬幣,返回-1
    return dp[amount] if dp[amount] != float('inf') else -1

時(shí)間復(fù)雜度O(nm),n為amoun面額,m為硬幣種數(shù)。空間復(fù)雜度為O(m),即為dp列表所用空間。

解法二:

接下來就是玄學(xué)位運(yùn)算了。先看代碼

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

def coinChange(coins, amount):
    if not amount:
        return 0
    dp = 1 << amount
    res = 0
    while dp:
        tmp = 0
        res += 1
        for i in coins:
            tmp |= dp >> i
        if tmp & 1:
            return res
        dp = tmp
    return -1

代碼注釋

def coinChange(coins, amount):
    if not amount:
        return 0
    # 按位左移運(yùn)算構(gòu)造類似dp數(shù)組的記錄二進(jìn)制
    dp = 1 << amount
    res = 0
    while dp:  # dp = 0或return 時(shí)循環(huán)結(jié)束
        tmp = 0  # tmp用于臨時(shí)記錄和承接上一個(gè)dp二進(jìn)制
        res += 1  # res為最終答案
        for i in coins:
            # 利用按位右移不斷右移。利用按位或運(yùn)算
            # 將前一次按位右移運(yùn)算與后一次按位右移運(yùn)算合并
            tmp |= dp >> i
        if tmp & 1:  # 當(dāng)tmp最后位數(shù)為1時(shí)res即為答案,返回res
            return res
        dp = tmp
    return -1

位運(yùn)算解法過程我打印出來了,不清楚的可以看看

def coinChange(coins, amount):
    if not amount:
        return 0
    dp = 1 << amount
    res = 0
    while dp:
        print('dp:', bin(dp))
        tmp = 0
        print('tmp:', bin(tmp))
        res += 1
        print('res:', res)
        for i in coins:
            print('i:', i)
            tmp |= dp >> i
            print('ys_tmp:', bin(tmp))
            print('--------------')
        if tmp & 1:
            return res
        dp = tmp
    return -1

輸出

dp: 0b100000000000
tmp: 0b0
res: 1
i: 1
ys_tmp: 0b10000000000
--------------
i: 2
ys_tmp: 0b11000000000
--------------
i: 5
ys_tmp: 0b11001000000
--------------
dp: 0b11001000000
tmp: 0b0
res: 2
i: 1
ys_tmp: 0b1100100000
--------------
i: 2
ys_tmp: 0b1110110000
--------------
i: 5
ys_tmp: 0b1110110010
--------------
dp: 0b1110110010
tmp: 0b0
res: 3
i: 1
ys_tmp: 0b111011001
--------------
i: 2
ys_tmp: 0b111111101
--------------
i: 5
ys_tmp: 0b111111101
--------------

雖然難理解,但是解題效率不是一般的高

時(shí)間復(fù)雜度O(n),n為coins長度??臻g復(fù)雜度O(1),使用有限變量。

到此這篇關(guān)于Python零錢兌換的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)Python零錢兌換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyCharm更換pip源、模塊安裝以及PyCharm依賴包導(dǎo)入導(dǎo)出功能

    PyCharm更換pip源、模塊安裝以及PyCharm依賴包導(dǎo)入導(dǎo)出功能

    這篇文章主要給大家介紹了關(guān)于PyCharm更換pip源、模塊安裝以及PyCharm依賴包導(dǎo)入導(dǎo)出功能的相關(guān)資料,我們在使用pycharm的時(shí)候,pycharm中的虛擬環(huán)境依賴包需要導(dǎo)出成一個(gè)文件,需要的朋友可以參考下
    2023-11-11
  • 說一說Python logging

    說一說Python logging

    這篇文章主要和大家聊一聊Python logging,Python logging是什么,Python logging的作用是什么,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 如何使用python記錄室友的抖音在線時(shí)間

    如何使用python記錄室友的抖音在線時(shí)間

    這篇文章主要介紹了如何使用python記錄室友的抖音在線時(shí)間,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Django框架orM與自定義SQL語句混合事務(wù)控制操作

    Django框架orM與自定義SQL語句混合事務(wù)控制操作

    這篇文章主要介紹了Django框架orM與自定義SQL語句混合事務(wù)控制操作,結(jié)合實(shí)例形式分析了同一個(gè)方法里面既有ORM又有自定義SQL 語句的情況下事務(wù)控制相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • 基于python連接oracle導(dǎo)并出數(shù)據(jù)文件

    基于python連接oracle導(dǎo)并出數(shù)據(jù)文件

    這篇文章主要介紹了基于python連接oracle導(dǎo)并出數(shù)據(jù)文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Linux下通過python獲取本機(jī)ip方法示例

    Linux下通過python獲取本機(jī)ip方法示例

    這篇文章主要給大家介紹了關(guān)于在Linux下通過python獲取本機(jī)ip的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 基于Python實(shí)現(xiàn)五子棋游戲

    基于Python實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了基于Python實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 利用Python模擬谷歌的小恐龍游戲

    利用Python模擬谷歌的小恐龍游戲

    谷歌流量器中有個(gè)很有名的彩蛋:當(dāng)你網(wǎng)絡(luò)出現(xiàn)問題時(shí),就會出現(xiàn)一個(gè)“小恐龍游戲”。本文就主要為大家介紹了如何用Python模擬實(shí)現(xiàn)這一小游戲,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-12-12
  • 使用Pandas對列名和索引進(jìn)行重命名的幾種常見方法

    使用Pandas對列名和索引進(jìn)行重命名的幾種常見方法

    在數(shù)據(jù)分析和處理中,Pandas是一個(gè)非常強(qiáng)大的工具,它提供了靈活的數(shù)據(jù)結(jié)構(gòu)和豐富的操作方法,使得數(shù)據(jù)處理變得更加簡單高效,其中,對數(shù)據(jù)的列名和索引進(jìn)行重命名是常見的需求之一,本文將從基礎(chǔ)概念出發(fā),逐步深入探討如何使用Pandas對列名和索引進(jìn)行重命名
    2024-12-12
  • 利用Python發(fā)送 10 萬個(gè) http 請求

    利用Python發(fā)送 10 萬個(gè) http 請求

    這篇文章主要介紹了如何利用Python發(fā)送 10 萬個(gè) http 請求,下面我們講利用Python寫代碼實(shí)現(xiàn)10 萬個(gè) url,對每個(gè) url 發(fā)送 http 請求,并打印請求結(jié)果的狀態(tài)碼,需要的朋友可以參考一下
    2021-12-12

最新評論

肃南| 上高县| 湘潭市| 滦平县| 江华| 云南省| 无为县| 名山县| 临城县| 萍乡市| 赤壁市| 东海县| 宣城市| 宜兴市| 颍上县| 武强县| 黔西| 莲花县| 浦江县| 铁岭市| 渭源县| 根河市| 西安市| 万山特区| 都兰县| 深水埗区| 上杭县| 叶城县| 深州市| 江津市| 历史| 江永县| 曲松县| 临桂县| 兴仁县| 阿图什市| 西盟| 五大连池市| 唐山市| 金坛市| 沛县|