虫虫首页|资源下载|资源专辑|精品软件
登录|注册

您现在的位置是:首页 > 技术阅读 >  每日一题:爬楼梯问题

每日一题:爬楼梯问题

时间:2024-02-14

题目70:爬楼梯

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

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

注意:给定 n 是一个正整数。

示例 1:

输入:2输出:2解释:有两种方法可以爬到楼顶。1.  1 阶 + 1 阶2.  2 阶
示例 2:
输入:3输出:3解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
分析

经典且最简单的dp问题

爬到第一阶有1种方法

爬到第二阶有2种方法

分析一下如何爬到第三阶,想要爬到第三阶,肯定需要爬到第一阶或者第二阶,那么爬到第三阶的方法数等于爬到第一阶的方法数加上爬到第二阶的方法数

分析一下如何爬到第四阶,想要爬到第四阶,肯定需要爬到第二阶或者第三阶,那么爬到第四阶的方法数等于爬到第二阶的方法数加上爬到第四阶的方法数

于是有:

dp[i]表示爬到第i阶有多少方法dp[1] = 1; // i = 1dp[2] = 2; // i = 2dp[i] = dp[i-1] + dp[i-2]; // i >=3
代码
class Solution {public:    int climbStairs(int n) {        if (n < 3) return n;        vector<int> dp(n+1, 0);// dp[i]表示爬到第i阶有多少方法        dp[1] = 1;        dp[2] = 2;        for (int i = 3; i <= n; ++i) {            dp[i] = dp[i-1] + dp[i-2];        }        return dp[n];    }};
扩展题目:三步问题
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

输入:n = 3输出:4说明: 有四种走法
示例2:
输入:n = 5输出:13
提示:
  1. n范围在[1, 1000000]之间

分析

dp的经典且最简单的问题,可以参见上一篇爬楼梯问题,但这里有点小细节需要注意

  • 三个数的和可能超过int最大值,所以使用int保存结果

  • 相加后需要对1000000007取余

代码

class Solution {public:    int waysToStep(int n) {        if (n < 3) return n;        if (n == 3) return 4;        vector<long long> dp(n+1, 0);// dp[i]表示爬到第i阶有多少方法        dp[1] = 1;        dp[2] = 2;        dp[3] = 4;        for (int i = 4; i <= n; ++i) {            dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % 1000000007;        }        return dp[n];    }};