【手把手带你刷好题】—— 53.爬楼梯(记忆化搜索、简单DP)

举报
安然无虞 发表于 2022/05/26 22:50:57 2022/05/26
【摘要】 【前言】 今天是刷题打卡第53天! 加油啦各位。 原题:爬楼梯(记忆化搜索、简单DP)  原题链接:力扣 题目描述:   示例1: 输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶 示例2: 输入: 3输出: 3解释: 有三种方...

【前言】

今天是刷题打卡第53天!

加油啦各位。

原题:爬楼梯(记忆化搜索、简单DP) 

原题链接:力扣

题目描述:

 

示例1:


  
  1. 输入: 2
  2. 输出: 2
  3. 解释: 有两种方法可以爬到楼顶。
  4. 1. 1 阶 + 1
  5. 2. 2

示例2:


  
  1. 输入: 3
  2. 输出: 3
  3. 解释: 有三种方法可以爬到楼顶。
  4. 1. 1 阶 + 1 阶 + 1
  5. 2. 1 阶 + 2
  6. 3. 2 阶 + 1

首先分析一下本题:

注意:注意这个题目问的是什么?

问的不是能爬多少次,而是有多少种方法能到最后一个台阶。

问题分析:当n > 2时,第一次爬就有两种不同的选择:一是第一次只爬一级,此时爬法数目等于后面剩下的(n - 1)级台阶的爬法数目,即为f(n - 1); 还有一种选择是第一次爬两级,此时爬法数目等于后面剩下的(n - 2)级台阶的爬法数目,即为f(n - 2).

所以有:f(n) = f(n - 1) + f(n - 2)

当n == 1时,有1种爬法;

当n == 2时,有2种爬法;

当n == 3时,有3种爬法;

当n == 4时,有5种爬法。

是呀,这题跟斐波那契数列基本上一样,不过这道题目需要思考一下,没有斐波那契这么明显。但是需要注意的是,递归边界还是有所不同的哦!

方法一:暴力递归

代码执行:


  
  1. class Solution {
  2. public:
  3. int climbStairs(int n) {
  4. //方法一:暴力递归
  5. //找边界
  6. if(n == 1){
  7. return 1;
  8. }
  9. if(n == 2){
  10. return 2;
  11. }
  12. return climbStairs(n - 1) + climbStairs(n - 2);
  13. }
  14. };

方法二:记忆化搜索(简单DP)

代码执行:


  
  1. class Solution {
  2. public:
  3. int climbStairs(int n) {
  4. //方法二:记忆化搜索(简单DP)
  5. //找边界
  6. if(n == 1){
  7. return 1;
  8. }
  9. if(n == 2){
  10. return 2;
  11. }
  12. //定义一个大小为n+1的整型数组,并且初始化为0
  13. vector<int> dp(n+1, 0);
  14. dp[1] = 1;
  15. dp[2] = 2;
  16. for(int i = 3; i < n+1; i++)
  17. {
  18. dp[i] = dp[i - 1] + dp[i - 2];
  19. }
  20. return dp[n];
  21. }
  22. };

结语

今天是刷题打卡第53天!

加油吧少年。

 

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121890091

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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