LeetCode70:爬楼梯

题目描述

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

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


解题思想

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

dpi: 爬到第i层楼梯,有dpi种方法

2.确定递推公式

从dpi的定义可以看出,dpi 可以有两个方向推出来。

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

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

那么dpi就是 dpi - 1与dpi - 2之和!

所以dpi = dpi - 1 + dpi - 2

3.dp数组如何初始化

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

dp0 = 0, dp1 = 1, dp2 = 2

4.确定遍历顺序

从递推公式dpi = dpi - 1 + dpi - 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];
    }
};
相关推荐
zander25812 分钟前
138. 随机链表的复制
数据结构·算法·链表
过期动态19 分钟前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
来一碗刘肉面28 分钟前
栈在递归中的应用
数据结构·算法
8K超高清39 分钟前
博冠获中国电影电视技术学会科技进步奖
人工智能·科技·算法·安全·接口隔离原则·智能硬件
皓月斯语1 小时前
程序设计语言的特点
开发语言·数据结构·c++
微石科技1 小时前
长期慢病如何做好居家管理?宁波微石科技星梦云康改善周期数据零散短板
大数据·科技·物联网·算法
邪修king1 小时前
C++ 进阶终章:异常机制与智能指针全解 —— 从错误处理到 RAII 资源管理,打通现代 C++ 的核心命脉
android·数据结构·c++
微露清风1 小时前
快速排序算法学习记录
学习·算法·排序算法
梓䈑7 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先