[LeetCode]. 746. 使用最小花費爬樓梯

1 題目描述

數組的每個索引做爲一個階梯,第 i個階梯對應着一個非負數的體力花費值 costi

每當你爬上一個階梯你都要花費對應的體力花費值,然後你可以選擇繼續爬一個階梯或者爬兩個階梯。

您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索引爲 0 或 1 的元素作爲初始階梯。

示例 1:

輸入: cost = [10, 15, 20]
輸出: 15
解釋: 最低花費是從cost[1]開始,然後走兩步即可到階梯頂,一共花費15。
 示例 2:

輸入: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
輸出: 6
解釋: 最低花費方式是從cost[0]開始,逐個經過那些1,跳過cost[3],一共花費6。
注意:

cost 的長度將會在 [2, 1000]。
每一個 cost[i] 將會是一個Integer類型,範圍爲 [0, 999]。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/min-cost-climbing-stairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

數組的每一個數字代表從當前樓梯邁出所需要耗費的體力
從地面開始,第一步可以選擇第0階或者第1階,都不費力
最終要求到達最後一個0(樓頂)所耗費的體力最少。
最終結果是要站到樓上,而不是站到臺階上,所以dp長度要加一

3 解決代碼

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        //dp數組的每一個元素表示到達當前樓層所需的最小花費
        //也就是dp的第i個值是不包含cost[i]的,因爲還沒從第i層走出去,沒消耗體力
        //dp的長度=cost+1,dp的最後一個元素就是到達樓頂所需的最小花費
        int[] dp = new int[cost.length + 1];
        dp[0] = 0;
        dp[1] = 0; //因爲最開始可以選擇起點,而選擇起點是不消耗體力的
        for(int i = 2; i < dp.length; i++){
            //要麼從第i-2層走到第i層,從要麼第i-1層走到第i層
            dp[i] = Math.min(dp[i - 2 ]+ cost[i - 2], dp[i - 1]+ cost[i - 1]);
        }
        return dp[dp.length - 1];
    }
}

// 數組的每一個數字代表從當前樓梯邁出所需要耗費的體力
// 從地面開始,第一步可以選擇第0階或者第1階,都不費力
// 最終要求到達最後一個0(樓頂)所耗費的體力最少。
// 最終結果是要站到樓上,而不是站到臺階上,所以dp長度要加一
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章