算法训练(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;
    }
};
相关推荐
mmz120739 分钟前
后缀表达式+栈(详解)(c++)
c语言·c++
oioihoii1 小时前
C++23 新特性:为 std::pair 的转发构造函数添加默认实参
算法·c++23
努力努力再努力wz1 小时前
【Linux实践系列】:进程间通信:万字详解共享内存实现通信
java·linux·c语言·开发语言·c++
m0_677904841 小时前
muduo源码解析
网络·c++
weixin_428498491 小时前
C/C++工程中的Plugin机制设计与Python实现
c语言·c++·python
智者知已应修善业1 小时前
【验证哥德巴赫猜想(奇数)】2021-11-19 15:54
c语言·c++·经验分享·笔记·算法
yangyang_z2 小时前
【C++设计模式之Strategy策略模式】
c++·设计模式·策略模式
cdut_suye2 小时前
【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析
java·linux·服务器·数据结构·c++·人工智能·python
-qOVOp-2 小时前
zst-2001 历年真题 设计模式
java·算法·设计模式
yaoshengvalve2 小时前
V型球阀材质性能深度解析:专攻颗粒、料浆与高腐蚀介质的工业利器-耀圣
开发语言·网络·数据结构·c++·安全·材质