爬楼梯,Climbing Stairs

举报
Linux猿 发表于 2021/10/24 22:00:32 2021/10/24
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题目描述
假设你正在爬楼梯。需要爬 n 阶才能到达楼顶。每次可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

二、测试样例
输入: 3

输出: 3

说明: 有三种方法可以爬到楼顶。

(1) 1 阶 + 1 阶 + 1 阶,1 阶 1 阶的爬;

(2) 1 阶 + 2 阶,先爬 1 阶,然后,爬 2 阶;

(3) 2 阶 + 1 阶,先爬 2 阶,然后,爬 1 阶;

所以,爬 3 阶的楼梯总共有三种方法。

三、算法思路
这题非常经典,可以使用动态规划的思想,假设 dp[i] 为爬 i 阶的楼梯总共的方法,那么,就有如下的转移方程:

dp[i] = dp[i-1] + dp[i-2] (i > 1)

即:爬到第 i 个阶的方法数等于从第 dp[i-1] 和 dp[i-2] 的和,因为只能爬 1 阶或 2 阶。

因为本题不需要保存爬每一阶的方法数,故可以将上述公式改成如下方式:

ans = first + second

first 为 dp[i-1],second 为 dp[i-2],不断更新 first 和 second 的值。

四、代码实现

class Solution {
public:
    int climbStairs(int n) {
        if(n <= 2) return n; // 小于 2 直接返回对应值
        int ans = 0;
        int first = 1, second = 2;
        for(int i = 3; i <= n; ++i) { // 大于 2 的情况
            ans = first + second;   // 求 ans
            first = second;  // 更新 first
            second = ans;    // 更新 second
        }
        return ans;
    }
};

五、复杂度分析
时间复杂度:O(n),很明显,一层 for 循环,时间复杂度为 O(n);

空间复杂度:O(1),仅适用了 3 个临时变量,可以忽略,故空间复杂度为 O(1);

六、题目链接
https://leetcode-cn.com/problems/climbing-stairs/


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。