前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-70. 爬楼梯(java)

LeetCode-70. 爬楼梯(java)

作者头像
bug菌
发布2023-05-27 15:22:12
2250
发布2023-05-27 15:22:12
举报
文章被收录于专栏:《项目实战教学》

一、前言:

👨‍🎓作者:bug菌 ✏️博客:CSDN​、掘金等 💌公众号:​​猿圈奇妙屋​​ 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

二、题目描述:

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

具体请看如下示例:

示例 1:

代码语言:javascript
复制
输入:n = 2
 输出:2
 解释:有两种方法可以爬到楼顶。
 1. 1 阶 + 1 阶
 2. 2 阶

示例 2:

代码语言:javascript
复制
输入:n = 3
 输出:3
 解释:有三种方法可以爬到楼顶。
 1. 1 阶 + 1 阶 + 1 阶
 2. 1 阶 + 2 阶
 3. 2 阶 + 1 阶

提示:

  • ​1 <= n <= 45​

题目来源:​​LeetCode官网​​题目难度:⭐⭐

三、思路分析:

思路1:

       首先遇到这种题目,第一感觉就是找规律推演,具体推演如下:

  • 第1节台阶:1种(爬1级)
  • 第2节台阶:2种(爬1级或爬2级)
  • 第3节台阶:3种(1 级 + 1 级 + 1 级或1 级 + 2 级或2 级 + 1 级)
  • 第4节台阶:5种
  • 第4节台阶:8种
  • ...
  • 第n节台阶:从n-1级台阶爬1级或从n-2级台阶爬2级。

推演得到一个递推公式:​​f(n) = f(n-1) + f(n-2)​

所以这里我们就可以用递归解决这个问题啦:但明显不是最优解啊,存在很多冗余计算。

思路2:

       推演得到公式:​​dp[i] = dp[i-1] + dp[i-2]​​​ 你还可以使用​​动态规划​​来解题呀,具体思路如下:

  • 初始化状态:i = 0 级开始爬的,所以从第 0 级爬到第 0 级,只有一种方案,即 dp[0]=1; i = 1 代表从第 0 级到第 1 级也只有一种方案,即爬一级,dp[0] = 1。
  • 遍历顺序:由状态转移方程知道dp[i] = dp[i−1] + dp[i−2] ,所以从前往后遍历即可。
  • 返回值:因为一共计算 n 阶楼梯有多少方案,所以返回dp[n]。

四、算法实现:

1、递归法_AC代码

具体算法代码实现如下:

代码语言:javascript
复制
class Solution {
         public int climbStairs(int n) {
             if (n == 1) {
                 return 1;
             }
             if (n == 2) {
                 return 2;
             }
             return climbStairs(n - 1) + climbStairs(n - 2);
         }
     }

2、动态规划_AC代码

具体算法代码实现如下:

代码语言:javascript
复制
class Solution {
         public int climbStairs(int n) {
  
             //先定义
             int p = 0, q = 0;
  
             //初始化=1;
             int r = 1;
  
             for (int i = 1; i <= n; i++) {
                 //赋值给f(n-2)
                 p = q;
                 //赋值给f(n-1)
                 q = r;
                 //求f(n)
                 r = p + q;
             }
             return r;
         }
     }

五、总结:

递归法之leetcode提交运行结果截图如下:

复杂度分析:

  • 时间复杂度:O(2^n)
  • 空间复杂度:1

明显这种思路是无法通过leetcode的,所以你们可想而知,算法也不是暴力都能解决的。

动态规划之leetcode提交运行结果截图如下:

复杂度分析:

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

        基于这种题,这里形成的数列正好是​​斐波那契数列​​,基本常识就是递归,可官方恰好避开了这种解答方式,毕竟性能不友好。但知道数列规律,再求解,就省去了百分之六十的思考时间了。

        再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

        好啦,以上就是本期的所有内容啦,咱们下期见咯。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言:
  • 二、题目描述:
  • 三、思路分析:
  • 四、算法实现:
    • 1、递归法_AC代码
      • 2、动态规划_AC代码
      • 五、总结:
        • 递归法之leetcode提交运行结果截图如下:
          • 动态规划之leetcode提交运行结果截图如下:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档