LeetCode 746. 使用最小花费爬楼梯

746. 使用最小花费爬楼梯

数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。
每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。
您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

需要注意:要爬上第N步阶梯有两种可能:

1:从第N-1步阶梯花费N-1对应cost
2:从第N-2步阶梯花费N-2对应cost
也就是说,爬上N步阶梯所对应的最小花费应该是以下取最小:
1: 爬到N-1步的最小花费加上cost[N-1]
2: 爬到N-2步的最小花费加上cost[N-2]

怎么知道前面的最小花费呢?

从头开始算!
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        //需要爬到最顶,所以应该多出一个位置表示“顶端”
        int[] re=new int[cost.length+1];
        //0和1可以直接上,所以上到0和1花费都是0
        re[0]=0;
        re[1]=0;
        //开始爬楼梯
        for(int i=2;i<re.length;i++){
            re[i]=Math.min(re[i-1]+cost[i-1],re[i-2]+cost[i-2]);
        }
        //返回顶端对应的花费
        return re[re.length-1];
    }
}

LeetCode 746. 使用最小花费爬楼梯_第1张图片

一点点优化:爬某一节楼梯只需要前面两节的数据即可,没有必要全部存下来
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int step1=0;
        int step2=0;
        int temp=0;
        //开始爬楼梯
        for(int i=2;i<cost.length+1;i++){
            temp=Math.min(step2+cost[i-1],step1+cost[i-2]);
            step1=step2;
            step2=temp;
        }
        //返回顶端对应的花费
        return step2;
    }
}

LeetCode 746. 使用最小花费爬楼梯_第2张图片

你可能感兴趣的:(有趣的面试题,java,算法,面试)