LeetCode70:爬楼梯

题目描述

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

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


解题思想

1.确定dp数组以及下标的含义

dp[i]: 爬到第i层楼梯,有dp[i]种方法

2.确定递推公式

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 。

3.dp数组如何初始化

再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。

dp[0] = 0, dp[1] = 1, dp[2] = 2

4.确定遍历顺序

从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

代码

c 复制代码
class Solution {
public:
    int climbStairs(int n) {
       
        /*
            dp[i]:达到第i阶有dp[i]种方法
            递推公式:dp[i] = dp[i-1]+dp[i-2]
            初始化:dp[0] = 0,dp[1] = 1,dp[2] = 2
            确定遍历顺序:从前向后

        */
        vector<int> dp(n + 1);
        
        dp[1] = 1, dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

优化

c 复制代码
class Solution {
public:
    int climbStairs(int n) {
        if (n <= 2) return n;
        /*
            dp[i]:达到第i阶有dp[i]种方法
            递推公式:dp[i] = dp[i-1]+dp[i-2]
            初始化:dp[0] = 0,dp[1] = 1,dp[2] = 2
            确定遍历顺序:从前向后

        */
        int dp[3];
        dp[0] = 0, dp[1] = 1, dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[0] = dp[1];
            dp[1] = dp[2];
            dp[2] = dp[0] + dp[1];
        }
        return dp[2];
    }
};
相关推荐
还有糕手21 分钟前
算法【有依赖的背包】
算法·动态规划
pursuit_csdn1 小时前
力扣 347. 前 K 个高频元素
算法·leetcode
wen__xvn1 小时前
每日一题洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵c++
c++·算法·矩阵
makabaka_T_T1 小时前
25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表
数据结构·c++·算法·leetcode·链表·矩阵
辞半夏丶北笙2 小时前
最近最少使用算法(LRU最近最少使用)缓存替换算法
java·算法·缓存
BingLin-Liu2 小时前
蓝桥杯备考:六大排序算法
算法·排序算法
南玖yy2 小时前
C语言:数组的介绍与使用
c语言·开发语言·算法
小菜鸟博士2 小时前
手撕Vision Transformer -- Day1 -- 基础原理
人工智能·深度学习·学习·算法·面试
wclass-zhengge2 小时前
04树 + 堆 + 优先队列 + 图(D1_树(D6_B树(B)))
数据结构·b树
灰灰老师3 小时前
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
人工智能·算法·机器学习·数据挖掘·数据分析·kmeans·rapidminer