题解 | #最小花费爬楼梯#

最小花费爬楼梯

https://www.nowcoder.com/practice/6fe0302a058a4e4a834ee44af88435c7

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cost int整型一维数组 
     * @return int整型
     */
    public int minCostClimbingStairs (int[] cost) {
        // write code here
        // 动态规划问题,类似斐波那契数列
        // 状态转移方程 dp[i] = min(dp[i-1],dp[i-2])+cost[i]
        // 方程的含义是,从dp[i]出发的花费,有之前的dp花费,加上当前楼层的花费
        int n = cost.length;
        if(n == 0){
            return 0;
        }
        // 从0层走一步到1层,1层不用付费
        if(n == 1){
            return cost[0];
        }
        // 比如数组大小为n,也就是0-n-1,但是题目求得是到顶层,即n层的花费
        int[] dp = new int [n+1];
        // 从零层出发
        dp[0] = cost[0];
        // 从1层出发
        dp[1] = cost[1];
        for(int i =2; i <= n ; i++){
            // 如果刚好到底层,就不用再花费了
            int costValue = (i == n ) ? 0 : cost[i];
            dp[i] = Math.min(dp[i-1], dp[i-2]) + costValue;
        }
        return dp[n];
    }
}

题目意思不太好理解,数组表示的是当层楼的收费,如果收费说明你得离开,走一步或者两步。

特殊情况,空数组,return 0 ;如果只输入一个数字,那就是走一级,cost[0]

递推,如果是数组长度为2,可以是从1的时候出发,走一步到达2,也可以是从0出发走两步到2。从0出发cost[0],从1出发cost[1]。

所以在递推关系中,刺客站在dp[i],i级楼层也是付费的,它可以使从i-1到的,也可是从i-2到的,到了之后再付费cost[i]。如果刚好到顶楼,是不用付费的,因为你不用再往上走了,确实这样,cost数组也没有提供cost[n]的数值。

全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
10-15 03:05
门头沟学院 Java
CADILLAC_:凯文:我的邮箱是死了吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务