当前位置: 首页 > news >正文

LeetCode 热题 100_爬楼梯(81_70_简单_C++)(动态规划)

LeetCode 热题 100_爬楼梯(81_70_简单_C++)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(动态规划):
      • 代码实现
        • 代码实现(思路一(动态规划)):
        • 以思路一为例进行调试

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

输入输出样例:

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示:
1 <= n <= 45

题解:

解题思路:

思路一(动态规划):

1、这道题最主要的是分析出怎么解决爬楼梯,能否找到一定的规律。们发现,当我们爬第n层台阶的时候可以从n-1层台阶或n-2层台阶爬上来。
① 当楼梯数n=1时 有1种方法:1
② 当楼梯数n=2时 有2种方法:1+1,2
③ 当楼梯数n=3时 有3种方法:1+1+1,2+1;1+2。可以转换成从n=1爬2个台阶上来,和n=2爬1层台阶上来。
④ 当楼梯数n=4时 有5种方法:1+1+1+1,2+1+1,1+2+1;1+1+2,2+2。可以转换成从n=2爬2个台阶上来,和n=3爬1层台阶上来。
⑤ 我们发现f(n)=f(n-1)+f(n-2),正好符合斐波那契数列。

2、复杂度分析:
① 时间复杂度:O(n)。从第一层爬到第n层。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(动态规划)):
class Solution {
public:
    int climbStairs(int n) {
        // 初始化:
        // a = 1:表示爬到第 0 阶(地面)的方式数为 1
        // b = 1:表示爬到第 1 阶的方式数为 1
        // sum = 1:用于计算当前计算的阶梯方式数
        int a = 1, b = 1, sum = 1;

        // 循环直到 n 减少到 1
        // 计算从第 2 阶到第 n 阶的方式数,依次更新 a 和 b 的值
        while (n - 1) {
            // sum 存储爬到当前阶数(第 n 阶)的方式数
            // 当前阶数的方式数等于爬到前一阶(a)和前两阶(b)的方式数之和
            sum = a + b;

            // 更新 a 和 b:
            // a 更新为 b,表示爬到第 n 阶的方式数
            a = b;

            // b 更新为 sum,表示爬到下一个阶数(第 n+1 阶)的方式数
            b = sum;

            // 每次循环将 n 减少 1,直到 n 为 1 时退出循环
            --n;
        }

        // 返回 b,最终它存储的是爬到第 n 阶的方式数
        return b;
    }
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;

class Solution {
public:
    int climbStairs(int n) {
        // 初始化:
        // a = 1:表示爬到第 0 阶(地面)的方式数为 1
        // b = 1:表示爬到第 1 阶的方式数为 1
        // sum = 1:用于计算当前计算的阶梯方式数
        int a = 1, b = 1, sum = 1;

        // 循环直到 n 减少到 1
        // 计算从第 2 阶到第 n 阶的方式数,依次更新 a 和 b 的值
        while (n - 1) {
            // sum 存储爬到当前阶数(第 n 阶)的方式数
            // 当前阶数的方式数等于爬到前一阶(a)和前两阶(b)的方式数之和
            sum = a + b;

            // 更新 a 和 b:
            // a 更新为 b,表示爬到第 n 阶的方式数
            a = b;

            // b 更新为 sum,表示爬到下一个阶数(第 n+1 阶)的方式数
            b = sum;

            // 每次循环将 n 减少 1,直到 n 为 1 时退出循环
            --n;
        }

        // 返回 b,最终它存储的是爬到第 n 阶的方式数
        return b;
    }
};
    
    

int main(){
    Solution s;
    cout<<s.climbStairs(7);
    return 0;
}

LeetCode 热题 100_爬楼梯(81_70)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/94453.html

相关文章:

  • SLAM文献之-NR-SLAM: Non-Rigid Monocular SLAM
  • 使用独立服务器的最佳方式指南
  • 【软件测试】一篇总结软件测试的基础知识
  • redis(主从复制)教程
  • 播放本地视频-实现视频画廊功能
  • @emotion/css + react+动态主题切换
  • Ubuntu-22.04安装ROS2
  • [GESP202503 C++一级题解]:B4258 : 四舍五入
  • 《一本书讲透Elasticsearch:原理、进阶与工程实践》读书笔记
  • 老外讲解用Delphi 12.3作web
  • Linux搭建NFS服务
  • GPIO输出实验,控制LED灯
  • 地图(死亡细胞)
  • 第六章 数学
  • Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清
  • k8s 基础知识:Service + 负载均衡(下)
  • 【Django】教程-2-前端-目录结构介绍
  • 单细胞簇鉴定
  • ubuntu如何安装conda
  • 记录一次渗透测试/常用命令
  • 华为配置篇-ISIS基础实验
  • BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
  • 【机器学习】——模型评估与选择
  • 【大模型基础_毛玉仁】4.5 实践与应用--参数高效微调PEFT
  • 6、进程理论和简单进程创建
  • WMS系统功能设计和源码实现(Java开发)
  • Redisson - 分布式锁和同步器
  • 嵌入式系统中各类存储方式的区别及接口协议详解
  • 如何应对竞品分析不足导致的方案偏差
  • 禅道后台命令执行漏洞