You are given an integer array cost where cost[i] is the cost of ith step on a staircase. Once you pay the cost, you can either climb one or two steps.
You can either start from the step with index 0, or the step with index 1.
Return the minimum cost to reach the top of the floor.
Example 1:
Input: cost = [10,15,20]
Output: 15
Explanation: You will start at index 1.
- Pay 15 and climb two steps to reach the top.
The total cost is 15.
Example 2:
Input: cost = [1,100,1,1,1,100,1,1,100,1]
Output: 6
Explanation: You will start at index 0.
- Pay 1 and climb two steps to reach index 2.
- Pay 1 and climb two steps to reach index 4.
- Pay 1 and climb two steps to reach index 6.
- Pay 1 and climb one step to reach index 7.
- Pay 1 and climb two steps to reach index 9.
- Pay 1 and climb one step to reach the top.
The total cost is 6.
Constraints:
2 <= cost.length <= 10000 <= cost[i] <= 999
給一個陣列 cost, 其中每一個值 cost[i] 代表從第 i 階出發的 cost
每次從第i 階出發可以選擇爬1 階 或是爬 2 階
而最初只能從第0階或是第1 階出發
題目要求爬到最高階的最小 cost
舉例來看 這個問題
假設 cost 為 [10, 15, 20]
從第 0 階出發可以花出以下 決策樹
會發現包含的 1 階出發的決策樹
從第 0 階出發的最小 cost =
到 0 階的 cost + min(從第1 階出發的最小 cost, 從第 2 階出發的最cost)
所以問題結構如下 min_cost_from_i = cost[i] + min(min_cost_from_i+1, min_cost_from_i+2)
解遞迴子問題,為了避免重複解問題,所以倒著從最大階往下解過去比較方邊
為了方便初始話 從最後 底點是因為已經在目標所以 cost = 0
在 len(cost)-1 階的 cost 為 cost[len(cost)-1] 因為只要從 len(cost) - 1 爬 1 階就到終點
然後開始算 f(i) = cost(i) + min(f(i+1), f(i+2))
到最後 把 min(f(0), f(1)) 及為答案因為只能從 index 0 還有 index 1 出發
public class Solution {
public int minCostClimbingStairs(int[] cost) {
int minCost = 0;
int costLen = cost.length;
int lastOne = 0;
int lastTwo = cost[costLen-1];
for (int startStair = costLen - 2; startStair >= 0; startStair--) {
minCost = cost[startStair] + Math.min(lastOne, lastTwo);
lastOne = lastTwo;
lastTwo = minCost;
}
return Math.min(lastOne, lastTwo);
}
}- 找出 minCost 的遞迴子關系
- 設定最開始最頂點的 cost =0 , 然後逐步往回推算
- 計算 f(i) = cost(i)+ min(f(i+1), f(i+2))
