746. Min Cost Climbing Stairs

數組的每個索引做爲一個階梯,第 i個階梯對應着一個非負數的體力花費值 cost[i](索引從0開始)。

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

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

/**
 * Created by Joe on 2018/4/7.
 * 746. Min Cost Climbing Stairs
 * https://leetcode.com/problems/min-cost-climbing-stairs/description/
 */
public class P746 {
    public int minCostClimbingStairs(int[] cost) {
        return Math.min(getCost(cost, 0), getCost(cost, 1));
    }

    private int getCost(int[] cost, int i) {
        if (i >= cost.length) return 0;

        return cost[i] + Math.min(getCost(cost, i + 1), getCost(cost, i + 2));
    }
}

最開始的代碼,提示是在最後一個測試用例超時了。

之後看了討論區,都說是用DP。

還是對題目缺乏思考:只要發現劃分成子任務是非獨立的任務,即每一個子任務都需要依賴其他子任務的結果時候,就應該考慮使用DP

代碼:

public int minCostClimbingStairs(int[] cost) {
    if(cost == null)
        return 0;
    if(cost.length == 1)
        return cost[0];
    if(cost.length == 2)
        return Math.min(cost[0],cost[1]);
    int[] tmp = new int[cost.length];//記錄着必須選擇第i階臺階時,最小代價
    tmp[0] = cost[0];
    tmp[1] = cost[1];
    for(int i = 2; i < tmp.length; i++) {
        tmp[i] = Math.min(tmp[i - 2], tmp[i - 1]) + cost[i];
    }
    return Math.min(tmp[tmp.length - 1], tmp[tmp.length - 2]); //最後一步可以從最後一個臺階或者倒數第二個臺階跨越
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章