国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

數(shù)據(jù)結(jié)構(gòu)與算法之使用最小花費(fèi)爬樓梯

開發(fā) 后端 算法
數(shù)組的每個(gè)下標(biāo)作為一個(gè)階梯,第 i 個(gè)階梯對應(yīng)著一個(gè)非負(fù)數(shù)的體力花費(fèi)值 cost[i](下標(biāo)從 0 開始)。

[[443068]]

使用最小花費(fèi)爬樓梯

力扣題目鏈接:https://leetcode-cn.com/problems/min-cost-climbing-stairs

數(shù)組的每個(gè)下標(biāo)作為一個(gè)階梯,第 i 個(gè)階梯對應(yīng)著一個(gè)非負(fù)數(shù)的體力花費(fèi)值 cost[i](下標(biāo)從 0 開始)。

每當(dāng)你爬上一個(gè)階梯你都要花費(fèi)對應(yīng)的體力值,一旦支付了相應(yīng)的體力值,你就可以選擇向上爬一個(gè)階梯或者爬兩個(gè)階梯。

請你找出達(dá)到樓層頂部的最低花費(fèi)。在開始時(shí),你可以選擇從下標(biāo)為 0 或 1 的元素作為初始階梯。

示例 1:

  • 輸入:cost = [10, 15, 20]
  • 輸出:15
  • 解釋:最低花費(fèi)是從 cost[1] 開始,然后走兩步即可到階梯頂,一共花費(fèi) 15 。

示例 2:

  • 輸入:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
  • 輸出:6
  • 解釋:最低花費(fèi)方式是從 cost[0] 開始,逐個(gè)經(jīng)過那些 1 ,跳過 cost[3] ,一共花費(fèi) 6 。

提示:

  • cost 的長度范圍是 [2, 1000]。
  • cost[i] 將會(huì)是一個(gè)整型數(shù)據(jù),范圍為 [0, 999] 。

思路

這道題目可以說是昨天動(dòng)態(tài)規(guī)劃:爬樓梯的花費(fèi)版本。

注意題目描述:每當(dāng)你爬上一個(gè)階梯你都要花費(fèi)對應(yīng)的體力值,一旦支付了相應(yīng)的體力值,你就可以選擇向上爬一個(gè)階梯或者爬兩個(gè)階梯

所以示例1中只花費(fèi)一個(gè)15 就可以到階梯頂,最后一步可以理解為 不用花費(fèi)。

讀完題大家應(yīng)該知道指定需要?jiǎng)討B(tài)規(guī)劃的,貪心是不可能了。

確定dp數(shù)組以及下標(biāo)的含義

使用動(dòng)態(tài)規(guī)劃,就要有一個(gè)數(shù)組來記錄狀態(tài),本題只需要一個(gè)一維數(shù)組dp[i]就可以了。

dp[i]的定義:到達(dá)第i個(gè)臺(tái)階所花費(fèi)的最少體力為dp[i]。(注意這里認(rèn)為是第一步一定是要花費(fèi))

對于dp數(shù)組的定義,大家一定要清晰!

確定遞推公式

可以有兩個(gè)途徑得到dp[i],一個(gè)是dp[i-1] 一個(gè)是dp[i-2]。

那么究竟是選dp[i-1]還是dp[i-2]呢?

一定是選最小的,所以dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];

注意這里為什么是加cost[i],而不是cost[i-1],cost[i-2]之類的,因?yàn)轭}目中說了:每當(dāng)你爬上一個(gè)階梯你都要花費(fèi)對應(yīng)的體力值

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

根據(jù)dp數(shù)組的定義,dp數(shù)組初始化其實(shí)是比較難的,因?yàn)椴豢赡艹跏蓟癁榈趇臺(tái)階所花費(fèi)的最少體力。

那么看一下遞歸公式,dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就夠了,其他的最終都是dp[0]dp[1]推出。

所以初始化代碼為:

  1. vector<int> dp(cost.size()); 
  2. dp[0] = cost[0]; 
  3. dp[1] = cost[1]; 

確定遍歷順序

最后一步,遞歸公式有了,初始化有了,如何遍歷呢?

本題的遍歷順序其實(shí)比較簡單,簡單到很多同學(xué)都忽略了思考這一步直接就把代碼寫出來了。

因?yàn)槭悄M臺(tái)階,而且dp[i]又dp[i-1]dp[i-2]推出,所以是從前到后遍歷cost數(shù)組就可以了。

但是稍稍有點(diǎn)難度的動(dòng)態(tài)規(guī)劃,其遍歷順序并不容易確定下來。

例如:01背包,都知道兩個(gè)for循環(huán),一個(gè)for遍歷物品嵌套一個(gè)for遍歷背包容量,那么為什么不是一個(gè)for遍歷背包容量嵌套一個(gè)for遍歷物品呢?以及在使用一維dp數(shù)組的時(shí)候遍歷背包容量為什么要倒敘呢?

這些都是遍歷順序息息相關(guān)。當(dāng)然背包問題后續(xù)「代碼隨想錄」都會(huì)重點(diǎn)講解的!

舉例推導(dǎo)dp數(shù)組

拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,來模擬一下dp數(shù)組的狀態(tài)變化,如下:

使用最小花費(fèi)爬樓梯

如果大家代碼寫出來有問題,就把dp數(shù)組打印出來,看看和如上推導(dǎo)的是不是一樣的。

以上分析完畢,整體C++代碼如下:

  1. // 版本一 
  2. class Solution { 
  3. public
  4.     int minCostClimbingStairs(vector<int>& cost) { 
  5.         vector<int> dp(cost.size()); 
  6.         dp[0] = cost[0]; 
  7.         dp[1] = cost[1]; 
  8.         for (int i = 2; i < cost.size(); i++) { 
  9.             dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i]; 
  10.         } 
  11.         // 注意最后一步可以理解為不用花費(fèi),所以取倒數(shù)第一步,第二步的最少值 
  12.         return min(dp[cost.size() - 1], dp[cost.size() - 2]); 
  13.     } 
  14. }; 
  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

還可以優(yōu)化空間復(fù)雜度,因?yàn)閐p[i]就是由前兩位推出來的,那么也不用dp數(shù)組了,C++代碼如下:

  1. // 版本二 
  2. class Solution { 
  3. public
  4.     int minCostClimbingStairs(vector<int>& cost) { 
  5.         int dp0 = cost[0]; 
  6.         int dp1 = cost[1]; 
  7.         for (int i = 2; i < cost.size(); i++) { 
  8.             int dpi = min(dp0, dp1) + cost[i]; 
  9.             dp0 = dp1; // 記錄一下前兩位 
  10.             dp1 = dpi; 
  11.         } 
  12.         return min(dp0, dp1); 
  13.     } 
  14. }; 
  • 時(shí)間復(fù)雜度:
  • 空間復(fù)雜度:

當(dāng)然我不建議這么寫,能寫出版本一就可以了,直觀簡潔!

在后序的講解中,可能我會(huì)忽略這種版本二的寫法,大家只要知道有這么個(gè)寫法就可以了哈。

拓展

這道題描述也確實(shí)有點(diǎn)魔幻。

題目描述為:每當(dāng)你爬上一個(gè)階梯你都要花費(fèi)對應(yīng)的體力值,一旦支付了相應(yīng)的體力值,你就可以選擇向上爬一個(gè)階梯或者爬兩個(gè)階梯。

示例1:

輸入:cost = [10, 15, 20] 輸出:15

從題目描述可以看出:要不是第一步不需要花費(fèi)體力,要不就是第最后一步不需要花費(fèi)體力,我個(gè)人理解:題意說的其實(shí)是第一步是要支付費(fèi)用的!。因?yàn)槭钱?dāng)你爬上一個(gè)臺(tái)階就要花費(fèi)對應(yīng)的體力值!

所以我定義的dp[i]意思是也是第一步是要花費(fèi)體力的,最后一步不用花費(fèi)體力了,因?yàn)橐呀?jīng)支付了。

當(dāng)然也可以樣,定義dp[i]為:第一步是不花費(fèi)體力,最后一步是花費(fèi)體力的。

所以代碼這么寫:

  1. class Solution { 
  2. public
  3.     int minCostClimbingStairs(vector<int>& cost) { 
  4.         vector<int> dp(cost.size() + 1); 
  5.         dp[0] = 0; // 默認(rèn)第一步都是不花費(fèi)體力的 
  6.         dp[1] = 0; 
  7.         for (int i = 2; i <= cost.size(); i++) { 
  8.             dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); 
  9.         } 
  10.         return dp[cost.size()]; 
  11.     } 
  12. }; 

這么寫看上去比較順,但是就是感覺和題目描述的不太符。哈哈,也沒有必要這么細(xì)扣題意了,大家只要知道,題目的意思反正就是要不是第一步不花費(fèi),要不是最后一步不花費(fèi),都可以。

總結(jié)

大家可以發(fā)現(xiàn)這道題目相對于 昨天的動(dòng)態(tài)規(guī)劃:爬樓梯有難了一點(diǎn),但整體思路是一樣。

從動(dòng)態(tài)規(guī)劃:斐波那契數(shù)到 動(dòng)態(tài)規(guī)劃:爬樓梯再到今天這道題目,錄友們感受到循序漸進(jìn)的梯度了嘛。

每個(gè)系列開始的時(shí)候,都有錄友和我反饋說題目太簡單了,趕緊上難度,但也有錄友和我說有點(diǎn)難了,快跟不上了。

其實(shí)我選的題目都是有目的性的,就算是簡單題,也是為了練習(xí)方法論,然后難度都是梯度上來的,一環(huán)扣一環(huán)。

但我也可以隨便選來一道難題講唄,這其實(shí)是最省事的,不用管什么題目順序,看心情找一道就講。

難的是把題目按梯度排好,循序漸進(jìn),再按照統(tǒng)一方法論把這些都串起來,哈哈,所以大家不要催我哈,按照我的節(jié)奏一步一步來就行啦。

學(xué)算法,認(rèn)準(zhǔn)「代碼隨想錄」,沒毛病!

其他語言版本

Java

  1. class Solution { 
  2.     public int minCostClimbingStairs(int[] cost) { 
  3.         if (cost == null || cost.length == 0) { 
  4.             return 0; 
  5.         } 
  6.         if (cost.length == 1) { 
  7.             return cost[0]; 
  8.         } 
  9.         int[] dp = new int[cost.length]; 
  10.         dp[0] = cost[0]; 
  11.         dp[1] = cost[1]; 
  12.         for (int i = 2; i < cost.length; i++) { 
  13.             dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]; 
  14.         } 
  15.         //最后一步,如果是由倒數(shù)第二步爬,則最后一步的體力花費(fèi)可以不用算 
  16.         return Math.min(dp[cost.length - 1], dp[cost.length - 2]); 
  17.     } 

Python

  1. class Solution: 
  2.     def minCostClimbingStairs(self, cost: List[int]) -> int
  3.         dp = [0] * (len(cost)) 
  4.         dp[0] = cost[0] 
  5.         dp[1] = cost[1] 
  6.         for i in range(2, len(cost)): 
  7.             dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i] 
  8.         return min(dp[len(cost) - 1], dp[len(cost) - 2]) 

Go

  1. func minCostClimbingStairs(cost []intint { 
  2.  dp := make([]int, len(cost)) 
  3.  dp[0], dp[1] = cost[0], cost[1] 
  4.  for i := 2; i < len(cost); i++ { 
  5.   dp[i] = min(dp[i-1], dp[i-2]) + cost[i] 
  6.  } 
  7.  return min(dp[len(cost)-1], dp[len(cost)-2]) 
  8.  
  9. func min(a, b intint { 
  10.  if a < b { 
  11.   return a 
  12.  } 
  13.  return b 

 Javascript

  1. var minCostClimbingStairs = function(cost) { 
  2.     const dp = [ cost[0], cost[1] ] 
  3.  
  4.     for (let i = 2; i < cost.length; ++i) { 
  5.         dp[i] = Math.min(dp[i -1] + cost[i], dp[i - 2] + cost[i]) 
  6.     } 
  7.  
  8.     return Math.min(dp[cost.length - 1], dp[cost.length - 2]) 
  9. }; 

 

責(zé)任編輯:姜華 來源: 代碼隨想錄
相關(guān)推薦

2021-11-04 09:59:03

動(dòng)態(tài)規(guī)劃策略

2021-12-29 11:32:38

數(shù)據(jù)結(jié)構(gòu)算法爬樓梯

2020-12-31 05:31:01

數(shù)據(jù)結(jié)構(gòu)算法

2022-09-26 07:56:53

AVL算法二叉樹

2022-09-21 07:57:33

二叉搜索樹排序二叉樹

2020-10-30 09:56:59

Trie樹之美

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2023-03-08 08:03:09

數(shù)據(jù)結(jié)構(gòu)算法歸并排序

2020-10-12 11:48:31

算法與數(shù)據(jù)結(jié)構(gòu)

2020-10-20 08:14:08

算法與數(shù)據(jù)結(jié)構(gòu)

2022-01-18 19:13:52

背包問題數(shù)據(jù)結(jié)構(gòu)算法

2023-10-27 07:04:20

2021-09-29 18:28:41

數(shù)據(jù)結(jié)構(gòu)算法最小生成樹

2009-08-11 14:51:11

C#數(shù)據(jù)結(jié)構(gòu)與算法

2021-07-16 04:57:45

Go算法結(jié)構(gòu)

2021-12-10 11:27:59

數(shù)據(jù)結(jié)構(gòu)算法單調(diào)遞增的數(shù)字

2021-12-08 11:31:43

數(shù)據(jù)結(jié)構(gòu)算法合并區(qū)間

2009-08-11 14:43:42

C#數(shù)據(jù)結(jié)構(gòu)與算法

2021-12-21 11:39:01

數(shù)據(jù)結(jié)構(gòu)算法同構(gòu)字符串

2023-03-02 08:15:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美激情第二页| 色悠悠久久久久| 精品美女国产在线| 欧美写真视频网站| 国产69精品久久久久9999| 国产ts一区二区| 最新av在线免费观看| 激情小说激情视频| 黄色的视频在线免费观看| 成人深夜福利| 国产亚洲精品美女久久久久久久久久| 久久福利影院| 夜夜精品视频| 久久综合九色综合欧美98| 欧美日韩黄色大片| 欧美精品免费在线观看| 99久久无色码| 中文字幕2019第三页| 国产精品一区二区精品| 好男人看片在线观看免费观看国语| 亚洲三区视频| 久久五月天婷婷| 精品成在人线av无码免费看| 国产系列第一页| 亚洲激情图片小说视频| 一本—道久久a久久精品蜜桃| 人妻有码中文字幕| 成人免费高清观看| 日韩国产综合| 久久99国产精品尤物| 欧美日韩国产精品激情在线播放| 色久视频在线观看| 亚洲大奶少妇| 视频一区中文字幕国产| 欧美日韩精品专区| 欧美性视频精品| 国产精品videossex国产高清| 91九色在线porn| 亚洲国产不卡| 亚洲aaa精品| 国产精品视频午夜| 写真片福利在线播放| 日韩在线黄色| 一区二区三区日韩精品| 欧美日韩国产色| 日本欧美爱爱爱| 神马午夜dy888| 久久伊人国产| 国产精品99久久久久久久vr| 欧美日韩精品欧美日韩精品一综合| 久热精品视频在线免费观看| 中国人体摄影一区二区三区| av免费在线观看网站| 色婷婷久久久| 国产蜜臀av在线一区二区三区 | 国产欧美一区二区精品性色超碰 | 久久99影院| 黄网站在线免费看| 国产午夜精品一区二区三区欧美| 性做久久久久久久免费看| 成人免费视频网址| 国产一级大片| 久久国产电影| 综合激情成人伊人| 日本一区二区在线播放| 一级在线观看| 亚洲天堂偷拍| 亚洲成人亚洲激情| 国产 国语对白 露脸| 成人免费无遮挡| av综合在线播放| 欧美激情一区二区三区久久久| 亚洲色图久久久| 欧美精品麻豆| 欧美一区二区三区色| 亚洲AV无码成人精品一区| 亚洲男男av| 欧美激情一区二区在线| 国产91精品久| h片免费观看| 三级欧美在线一区| 欧美一级视频免费在线观看| а√天堂8资源在线官网| 久久无码av三级| 欧美日本韩国国产| 中文字幕乱码中文乱码51精品| 中文字幕va一区二区三区| 国产欧美 在线欧美| free性m.freesex欧美| 国产日韩欧美不卡在线| 国产有码一区二区| 九色porny自拍视频在线播放| 亚洲免费在线电影| 亚洲精品一区二区三区四区五区| 在线免费成人| 欧美日韩免费高清一区色橹橹| 久久福利电影| 欧美人妖在线| 久久国产精品视频| 国产嫩草在线视频| 另类人妖一区二区av| 美女精品久久久| 日本动漫同人动漫在线观看| 亚洲国产欧美在线| 青青在线免费观看| 日韩影院精彩在线| 亚洲精品免费av| 菠萝蜜一区二区| 亚洲美女视频网站| 国产永久免费高清在线观看视频| 国产亚洲精品美女久久| 狠狠躁天天躁日日躁欧美| 亚洲一二三区在线| 97久久综合精品久久久综合| 狠狠躁夜夜躁人人爽超碰91| 亚洲一区三区视频在线观看| 日本亚州欧洲精品不卡| 色婷婷综合中文久久一本| 99爱免费视频| 国产视频一区在线播放| 日韩免费视频播放| 蜜臀久久99精品久久久画质超高清 | 欧美一区二区黄| 天天av综合网| 国产成人精品三级麻豆| 国产日韩三区| 91免费国产网站| 亚洲精选av在线| 四季av一区二区三区免费观看| 678五月天丁香亚洲综合网| www.av99| 青青草一区二区三区| 国产精品99久久久久久www| 大菠萝精品导航| 欧美亚一区二区| 成人免费在线观看网站| 激情五月激情综合网| 96sao精品视频在线观看| 成人性生交大片免费网站| 国产欧美日本一区二区三区| av一区二区在线看| 欧美精品高清| 亚洲人一二三区| 国产日韩欧美在线| 成人不卡视频| 成人小视频免费在线观看| 国产精品成久久久久三级 | 国产午夜精品视频免费不卡69堂| 免费观看中文字幕| 欧美片第1页综合| 国产成人精品免高潮在线观看| 香蕉视频国产在线观看| 精品卡一卡二卡三卡四在线| 国产精品99久久免费| 岛国视频一区免费观看| 久久精品国产在热久久| 亚洲一本大道| 亚洲欧美日韩国产精品| 婷婷综合网站| 可以免费在线看黄的网站| 欧美日韩国产三级| 久久不见久久见免费视频7| 性欧美18一19内谢| 色老汉av一区二区三区| 欧美男同视频网| 欧美日韩久久久久| 天堂a中文在线| 日韩一级免费观看| 精品一区二区三区视频在线播放| 国产日韩在线播放| 欧美成人国产一区二区| 成年人羞羞的网站| 国产精品国产三级国产aⅴ入口| 久久99久久| …久久精品99久久香蕉国产| 久久av资源站| 九色视频在线播放| 成人激情视频在线观看| 久久久久久久电影| 国模套图日韩精品一区二区| 国产91免费观看| 久久综合成人精品亚洲另类欧美 | 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品欧美久久| 日韩欧美美女一区二区三区| 红桃视频国产一区| 翔田千里一区| 亚洲精品欧美日韩专区| 欧洲一区二区三区在线| 老司机午夜精品99久久| 中文字幕在线中文字幕在线中三区| 91看片淫黄大片91| 国产一区二区三区三区在线观看| 色婷婷色综合| 污视频网站在线观看| 国产精品激情av电影在线观看| 国产ts人妖一区二区| 日韩午夜电影免费看| 久久美女福利视频| 国产精品jizz在线观看麻豆|