算法训练(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;
    }
};
相关推荐
南岩亦凛汀16 分钟前
在Linux下使用wxWidgets进行跨平台GUI开发
c++·跨平台·gui·开源框架·工程实战教程
曦月逸霜39 分钟前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
galaxy_strive43 分钟前
绘制饼图详细过程
开发语言·c++·qt
海的诗篇_2 小时前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法
自动驾驶小卡2 小时前
A*算法实现原理以及实现步骤(C++)
算法
Unpredictable2222 小时前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉
编程绿豆侠2 小时前
力扣HOT100之多维动态规划:1143. 最长公共子序列
算法·leetcode·动态规划
珂朵莉MM2 小时前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
PingdiGuo_guo3 小时前
C++智能指针的知识!
开发语言·c++