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

LeetCode 509. 斐波那契数

链接:509. 斐波那契数

思路:

非常经典的一道题,可以有很多种解法,今天主题是动态规划,所以本题主要思路就是用动态规划来解。首先定义dp下标,dp[n]表示的含义为第n个斐波那契数,那么根据斐波那契数列的定义,递推公式为dp[n]=dp[n-1]+dp[n-2]。然后初始化dp数组的前两个数dp[0]=0,dp[1]=1。由于我们只用到了dp数组的前两个数,所以只需要长度为2的数组就可以了,可以优化一下空间。

代码:

class Solution {
public:
    int fib(int n) {
        vector dp(2);
        dp[0] = 0;
        dp[1] = 1;
        if (n <= 1)
            return n;
        for (int i = 2; i <= n; i++)
        {
            int temp = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = temp;
        }
        return dp[1];
    }
};

LeetCode 70. 爬楼梯

链接:70. 爬楼梯

思路:

和上题509. 斐波那契数的代码几乎一样。题目求不同的方法可以爬到楼顶,定义下标dp[n]为到达台阶n的方法数量,到达台阶n可以从n-1台阶爬一个台阶到达,也可以从n-2台阶爬两个台阶到达,所以到达台阶n的方法数量就等于到达台阶n-1的方法数量加上到达台阶n-2的方法数量,递推公式为dp[n]=dp[n-1]+dp[n-2]。优化一下空间可以只存两个变量,最后返回dp[1]即可。

代码:

class Solution {
public:
    int climbStairs(int n) {
        if (n == 1)
            return 1;
        vector dp(2);
        dp[0] = 1;
        dp[1] = 2;
        for (int i = 2; i < n; i++)
        {
            int temp = dp[0] + dp[1];
            dp[0] = dp[1];
            dp[1] = temp;
        }
        return dp[1];
    }
};

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

链接:746. 使用最小花费爬楼梯

思路:

定义下标dp[i]表示到达第i层所需要的最小花费,因为既可以从下标0开始又可以从下标1开始,所以dp[0]和dp[1]都初始为0。之后定义递推公式,到达第i层可以从第i-1层,花费cost[i-1]往上爬1层,也可以从第i-2层,花费cost[i-2],往上爬两层,所以只要求两者之间的最小值就可以了。具体公式为dp[i]=min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])。

注意一开始初始化dp数组大小为cost.size()+1,因为到达楼梯顶部是需要从cost数组的最后两个台阶往上爬一层或者两层,所以最后返回dp数组的下标也是cost.size(),表示最后一层台阶的上一层,即为楼梯顶层。

代码:

class Solution {
public:
    int minCostClimbingStairs(vector& cost) {
        vector 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()];
    }
};

你可能感兴趣的:(代码随想录算法训练营,leetcode,算法,职场和发展)