746. 使用最小花费爬楼梯 思路 || 力扣 || 附代码

其实类似于爬楼梯的基础问题,搞清楚dp数组的含义很关键

思路:

1. dp[i] : 含义: 到达下标为i的台阶需要的 最小 花费;

2. 然后,因为可以从下标为0开始的台阶开始,所以dp[0] = 0; 也可以从下标为1开始的台阶开始,所以dp[0] = 0;

3. 之后,dp[1]: 可以从 下标为0 上两个台阶到达,也可以从 下标为1 上一个台阶到达,所以求一下两者的最小值即可

4. 那么dp[3]、dp[4]... dp[i] 呢? 都可以从前两次的花费退出来,即可以从下标为i - 1在上一个台阶到达, 也可以从下标为 i - 2的台阶再上两个台阶达到: 两者分别花费 : dp[i - 1] + cost[i -1] 和 dp[i - 2] + cost[i - 2],所以在求一个二者的最小值即可。

复杂度

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

Code

#define MIN(a,b) ((a) > (b) ? (b) : (a))

int minCostClimbingStairs(int* cost, int costSize) {
    int* dp = (int*)malloc(sizeof(int) * (costSize+1));
    dp[0] = 0;
    dp[1] = 0;
    dp[2] = MIN(cost[0],cost[1]);
    for(int i = 3; i <= costSize; i ++){
        int one = dp[i - 1] + cost[i - 1];
        int two = dp[i - 2] + cost[i -2];
        dp[i] = MIN(one,two);
    }
    
    return dp[costSize];
}
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    睡个好觉(努力提升自己版)

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值