一個樓梯,第i階都有一個非負的花費cost[i],從0開始索引。java
一旦你支付了花銷,你就能夠跳上一階或者兩階。你須要找到到達樓梯頂的最小花費,你能夠選擇從樓梯第0階或者第1階開始。數組
例子1spa
輸入: cost = [10, 15, 20]code
輸出: 15blog
解釋: 最小花費是從第1階開始,支付15跳上兩階就到達樓梯頂。索引
例子2io
輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]class
輸出: 6方法
解釋: 最小花費是從第0階開始,跳的階梯順序爲0,2,4,6,7,9,頂部,花費爲6。im
注意
cost數組長度在[2, 1000]
cost數組中的元素大小範圍[0, 999]
這道題目相似於爬樓梯問題,只不過加上了花銷,是一個典型的動態規劃問題。
這個題目說能夠從第0階開始,也能夠從第1階開始,咱們先只考慮一種狀況,即只從第0階開始。那麼假設dp[i]表示跳到第i階所需的最小花費,那麼能夠獲得遞推式dp[i] = min(dp[i-1] + cost[i - 1], dp[i-2] + cost[i-2])。
最後返回dp[cost.length],即跳到樓梯頂(第cost.length階)的最小花費。接下來再考慮從第一階開始的狀況,咱們能夠把第1階當作第0階,而後繼續使用前面的方法,最後返回這兩個dp[cost.length]的最小值。
class Solution { public int minCostClimbingStairs(int[] cost) { int a = 0,b=0,temp=0; //TODO 爲何長度要+1了,你知道麼? int length = cost.length+1; for (int i = 2; i < length;i++){ temp = Math.min(a+cost[i-2],b+cost[i-1]); a = b; b = temp; } return temp; } }
疑問:
例子1
輸入: cost = [10, 15, 20]
輸出: 15
疑問:直觀感覺,是否是應該從10直接跳轉到20,輸出應該是10?
例子2
輸入:[0,0,1,1]
輸出:1
疑問:直觀感覺,是否是應該從第二個0(索引是1)直接跳轉到最後一個1(索引是3),輸出應該是0?
瞅瞅,題意說的最終目的是達到終點位置,而不是站在最後一個索引位置(20所在位置)。
因此,若是咱們要到達終點,須要從cost[1](值是15) 開始,跨2個階梯,直接達到終點。所耗費的錢是15.
若是從索引cost[0](值是10)開始,則須要通過cost[0],cost[0]才能到達終點,所耗費的錢是 25.
同理,代碼中 長度爲何要+1
//TODO 爲何長度要+1了,你知道麼? int length = cost.length+1;
其實是爲了計算到達終點的位置所耗費的金錢。所以length須要+1