动态规划 Leetcode 746 使用最小花费爬楼梯

使用最小花费爬楼梯

Leetcode 746

学习记录自代码随想录

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。

示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。

  • 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
  • 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
  • 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
  • 支付 1 ,向上爬一个台阶,到达楼梯顶部。
    总花费为 6 。

提示:
2 <= cost.length <= 1000
0 <= cost[i] <= 999

要点:1.需要想出递推公式: d p [ i ] = m i n ( d p [ i − 1 ] + c o s t [ i − 1 ] , d p [ i − 2 ] + c o s t [ i − 2 ] ) dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]) dp[i]=min(dp[i1]+cost[i1],dp[i2]+cost[i2])

方法一:dp数组用vector表示

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        if(cost.size() <= 2) return min(cost[0], cost[1]);
        int n = cost.size();
        // 1.dp数组含义,爬到第i个台阶所需支付的费用(此处并不算第i阶台阶的花费),爬到顶层是总台阶数加1
        vector<int> dp(n+1);
        // 2.递推公式 dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
        // 3.初始化
        dp[0] = 0;
        dp[1] = 0;
        // 4.遍历顺序,从前向后
        for(int i = 2; i < n+1; i++){
            dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        // 5.举例推导 eg.对[10,15,20]得dp数组为0,0,10,15,返回末尾15
        return dp[n];
    }
};

方法二:简化dp数组标志,用两个变量迭代变化,减少空间复杂度

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        if(cost.size() <= 2) return min(cost[0], cost[1]);
        int n = cost.size();
        // 1.dp数组含义,爬到第i个台阶所需支付的费用(此处并不算第i阶台阶的花费),爬到顶层是总台阶数加1
        // vector<int> dp(n+1);
        // 2.递推公式 dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
        // 3.初始化
        int dp_1 = 0;
        int dp_2 = 0;
        // 4.遍历顺序,从前向后
        for(int i = 2; i < n+1; i++){
            int dp_temp = min(dp_1 + cost[i-1], dp_2 + cost[i-2]);
            dp_2 = dp_1;
            dp_1 = dp_temp;
        }
        // 5.举例推导 eg.对[10,15,20]得dp数组为0,0,10,15,返回末尾15
        return dp_1;
    }
};

相关推荐

  1. 动态规划 Leetcode 746 使用花费楼梯

    2024-03-11 14:16:04       17 阅读
  2. leetcode746.使用花费楼梯动态规划

    2024-03-11 14:16:04       9 阅读
  3. LeetCode 746. 使用花费楼梯

    2024-03-11 14:16:04       46 阅读
  4. LeetCode 746. 使用花费楼梯

    2024-03-11 14:16:04       20 阅读
  5. LeetCode 746. 使用花费楼梯

    2024-03-11 14:16:04       13 阅读
  6. LeetCode 746.使用花费楼梯

    2024-03-11 14:16:04       4 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 14:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 14:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 14:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 14:16:04       18 阅读

热门阅读

  1. 网络层学习常见问题及答案整理

    2024-03-11 14:16:04       20 阅读
  2. 跨域问题总结

    2024-03-11 14:16:04       23 阅读
  3. 012-路由模式

    2024-03-11 14:16:04       25 阅读
  4. C# 使用DocX生成word文档

    2024-03-11 14:16:04       21 阅读
  5. ElasticSearch

    2024-03-11 14:16:04       23 阅读
  6. 聊聊pytho中的函数

    2024-03-11 14:16:04       26 阅读
  7. QT状态机入门

    2024-03-11 14:16:04       18 阅读
  8. 【设计模式】概述及七大设计原则

    2024-03-11 14:16:04       20 阅读
  9. error:0308010C:digital envelope routines::unsupported

    2024-03-11 14:16:04       23 阅读