算法训练(leetcode)第二十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

刷题记录

  • [509. 斐波那契数](#509. 斐波那契数)
  • [70. 爬楼梯](#70. 爬楼梯)
  • [746. 使用最小花费爬楼梯](#746. 使用最小花费爬楼梯)

509. 斐波那契数

leetcode题目地址

递归

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

cpp 复制代码
// c++
class Solution {
public:
    int fib(int n) {
        if(n<2) return n;
        return fib(n-1) + fib(n-2); 
    }
};

循环

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

cpp 复制代码
//c++
class Solution {
public:
    int fib(int n) {
        if(n<2) return n;
        int a=0, b=1;
        for(int i=2; i<=n; i++){
            swap(a, b);
            b += a;
        }
        return b;
    }
};

动态规划

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

cpp 复制代码
// c++
class Solution {
public:
    int fib(int n) {
        if(n<2) return n;
        vector<int> dp(n+1, 0);
        dp[1]=1;
        for(int i=2; i<=n; i++){
            dp[i] = dp[i-1] + dp[i-2]; 
        }
        return dp[n];
    }
};

70. 爬楼梯

leetcode题目地址

本质上还是斐波那契数列。用递归会在45处时间超限。

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

cpp 复制代码
// c++
class Solution {
public:
    int climbStairs(int n) {
        if(n<=2) return n;
        int a=1, b=2;
        for(int i=3; i<=n; i++){
            swap(a,b);
            b+=a;
        }
        return b;
        
    }
};

746. 使用最小花费爬楼梯

leetcode题目地址

动态规划。使用dp记录到达第i个楼梯所需要花费的费用。起始位置不需要支付费用,而起始位置可以是0和1,因此0、1位置的dp值为0.从2开始计算当前位置所需的最小花费。到达第i层的费用等于到达前一步的最小花费+前一步的花费。具体来说,若前一步是爬1个台阶到达第i层,则第i层的花费为cost[i-1]+dp[i-1];若前一步是爬2个台阶到达第i层,则第i层的花费为cost[i-2]+dp[i-2]。

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

cpp 复制代码
// c++
class Solution {
public:
    
    int minCostClimbingStairs(vector<int>& cost) {
        
        vector<int> dp(cost.size()+1, 0);
        for(int i=2; i<=cost.size(); i++){
            dp[i] = min(cost[i-1]+dp[i-1], cost[i-2]+dp[i-2]);
        }
        return dp[cost.size()];
    }
};

优化空间:上面的代码中起始每次都是只操作前面两个空间,因此只使用两个变量来计算既可。

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

cpp 复制代码
//c++
class Solution {
public:
    
    int minCostClimbingStairs(vector<int>& cost) {
        
        int a=0, b=0;
        for(int i=2; i<=cost.size(); i++){
            int mincost = min(cost[i-1]+b, cost[i-2]+a);
            a = b;
            b = mincost;
        }
        return b;
    }
};
相关推荐
Swift社区2 小时前
LeetCode 394. 字符串解码(Decode String)
算法·leetcode·职场和发展
另寻沧海2 小时前
测试中的 AAA 模式与 Given–When–Then 模式详解
c++·单元测试·测试覆盖率
tt5555555555552 小时前
LeetCode进阶算法题解详解
算法·leetcode·职场和发展
让我们一起加油好吗2 小时前
【基础算法】DFS中的剪枝与优化
算法·深度优先·剪枝
Q741_1473 小时前
C++ 模拟题 力扣495. 提莫攻击 题解 每日一题
c++·算法·leetcode·模拟
Felven4 小时前
A. Be Positive
算法
小O的算法实验室4 小时前
2026年COR SCI2区,自适应K-means和强化学习RL算法+有效疫苗分配问题,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
青岛少儿编程-王老师4 小时前
CCF编程能力等级认证GESP—C++7级—20250927
数据结构·c++·算法
Miki Makimura4 小时前
Reactor 模式实现:从 epoll 到高并发调试
运维·服务器·c++·学习
夏鹏今天学习了吗5 小时前
【LeetCode热题100(39/100)】对称二叉树
算法·leetcode·职场和发展