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

Leetcode 509. 斐波那契数

题目链接:509. 斐波那契数

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

经典且简易

Leetcode 70. 爬楼梯

题目链接:70. 爬楼梯

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

要点:

  1. n = 3时,要么从1直接到3,要么1先到2再到3,也就是斐波那契数

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

题目链接:70. 爬楼梯

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        for(int i = 2; i < cost.size(); i++){
            cost[i] += min(cost[i-1],cost[i-2]);
        }
        return min(cost[cost.size()-1],cost[cost.size()-2]);
    }
};

//标准一点的dp
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size());
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i < cost.size(); i++){
            dp[i] = cost[i] + min(dp[i-1],dp[i-2]);
        }
        return min(dp[dp.size()-1],dp[dp.size()-2]);
    }
};

你可能感兴趣的:(代码随想录算法训练营十五期,算法)