Leetcode 746: Min Cost Climbing Stairs(详解)

题目描述

一个楼梯,第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

相关文章
相关标签/搜索