文章链接: 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

视频链接: 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

题目链接: 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯


理论基础:


思维导图

幕布链接 https://www.mubu.com/doc/4s8JP0BAo8R

代码随想录算法训练营第三十二天| 509.斐波那契数、70.爬楼梯、746. 使用最小花费爬楼梯_斐波那契数


题目大纲

代码随想录算法训练营第三十二天| 509.斐波那契数、70.爬楼梯、746. 使用最小花费爬楼梯_数组_02


509.斐波那契数

思路:

递归五部曲

1.确定dp数组含义;

2.确定递推公式;

3.初始化dp数组;

4.确定遍历顺序(从前往后、从后往前);

5.打印dp数组(用于Debug);

class Solution {
public:
    int fib(int n) {
        if (n <= 1) return n;
        int dp[2];
        // 初始化:
        dp[0] = 0;
        dp[1] = 1;
        int sum = 0;
        for (int i = 2; i <= n; i++) {
            sum = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = sum;
        }
        return sum;
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

70.爬楼梯

思路:

1阶:1种方法

2阶:2种方法(1 + 1、2)

3阶:3种方法(从1阶迈两步、从2阶迈一步)

4阶:5种方法(从2阶迈两步、从3阶迈一步

……

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n;
        vector<int> dp(n + 1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

746.使用最小花费爬楼梯

思路:

当下标大于等于2后,到达一个台阶就有两种方法(跳一步、跳两步),所以只需要比较两种方法哪个较少消费就行。

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size() + 1);
        dp[0] = 0;
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            // 最少消费
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.size()];
    }
};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.