爬楼梯问题有多种出现形式,有不固定最多可跨阶数(即最多可跨阶数为M,M作为方法参数)的,有固定每次最多可跨2阶的。接下来,我就对以上两种出线形势分别进行分析。

(一)固定每次最多跨越2阶,使用非递归方式实现:

1、问题描述:

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

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

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

 2、首先我们把 n<=5 的不同情况列出来:

1 2 3 4 5
1 2 3 5 8

综上我们可以看出,爬楼梯的方案数f(n) = f(n) + f(n-1)

3、我们用java代码实现以上思路:

class Solution {public int climbStairs(int n) {if(n==1||n==2){return n;}int f1 = 1;int f2 = 2;int temp;for(int i=3; i<=n; i++){temp = f2;f2 += f1;f1 = temp;}return f2;  }
}

4、运行结果:

(二)使用递归方式实现

1、问题描述:

假设一个楼梯有 N 阶台阶,人每次最多可以跨 M 阶,求总共的爬楼梯方案数。

2、算法实现(java语言):

private static int calculateCount(int ladder, int maxJump) {int jump = 0;if (ladder == 0) {return 1;}if (ladder >= maxJump) {// 剩下的楼梯大于最大可跳跃数for (int i = 1; i <= maxJump; i++) {jump += calculateCount(ladder - i, maxJump);               }} else {// 剩下的楼梯不足最大可跳跃数jump = calculateCount(ladder, ladder);         }return jump;}

(三)递归和非递归实现性能比较:

package test;/*** * @author FHY* 爬楼梯问题**/
public class DynamicTest {public static void main(String[] args) {//对递归和非递归实现两种方法进行性能比较:long start = System.currentTimeMillis();getNums(30);long end1 = System.currentTimeMillis();System.out.println("非递归实现:"+(end1-start));calculateCount(30,2);long end2 = System.currentTimeMillis();System.out.println("递归实现:"+(end2-end1));}private static int calculateCount(int ladder, int maxJump) {       int jump = 0;if (ladder == 0) {return 1;}if (ladder >= maxJump) {// 剩下的楼梯大于最大可跳跃数for (int i = 1; i <= maxJump; i++) {jump += calculateCount(ladder - i, maxJump);}} else {// 剩下的楼梯不足最大可跳跃数jump = calculateCount(ladder, ladder);}      return jump;}public static int getNums(int n){if(n==1||n==2){return n;}int f1 = 1;int f2 = 2;int temp;for(int i=3; i<=n; i++){temp = f2;f2 += f1;f1 = temp;}       long end = System.currentTimeMillis();return f2;}
}

输出:

非递归实现:0
递归实现:14

可见,递归实现性能很差!

leetcode 70. 爬楼梯问题(多种方法总结)相关推荐

  1. Python描述 LeetCode 70. 爬楼梯

    Python描述 LeetCode 70. 爬楼梯   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端开发.pyt ...

  2. LeetCode 70爬楼梯71简化路径72编辑距离(dp)

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...

  3. leetcode - 70. 爬楼梯

    70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...

  4. 变形版汉诺塔:LeetCode:70爬楼梯

    70. 爬楼梯 题目链接:70:爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1 ...

  5. LeetCode - 70. 爬楼梯(人肉递归、动态规划)2

    70 . 爬楼梯 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 ...

  6. LeetCode 70. 爬楼梯 (递归斐波那契 | 动态规划)

    70. 爬楼梯 解法1 (暴力递归) 推出递推式子:f(n) = f(n - 1) + f(n - 2) 是一个斐波那契数列,用递归 class Solution {public int climbS ...

  7. Leetcode 70.爬楼梯

    Time: 20190904 Type: Easy 考察:动态规划 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注 ...

  8. Leetcode 70. 爬楼梯 动态规划 c语言

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数.示例 1: 输入: 2 输出: 2 解释: 有两种 ...

  9. 84. Leetcode 70. 爬楼梯 (动态规划-基础题)

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. 1. 1 阶 ...

最新文章

  1. android 锁屏画面开发,android 锁屏应用开发
  2. 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法
  3. Bitcoin ABC和区块上限——通过技术实现更大的区块
  4. linux rar工具
  5. FormData的使用
  6. js change事件 获取新值和旧值_前端总结(JS篇)
  7. windows Ctrl + Alt + 方向键 取消屏幕反转
  8. Spingboot定时任务与多线程
  9. HTTPBrowserCapabilities---在asp.net中显示浏览器属性
  10. java保留两位小数 四种方式
  11. IONIC打包安卓遇到COM.ANDROID.SUPPORT:SUPPORT-V4错误的解决办法
  12. Vue学习笔记之07-v-for循环遍历
  13. 使用include实现布局(layout)复用
  14. Transformer-XL 2
  15. 自适应波束形成matlab,自适应波束形成matlab
  16. 《李宗仁回忆录》完整版在线及电子书下载
  17. 丧钟为谁而鸣:AI步步逼近,华尔街23万人将失业
  18. JavaScript绘制矢量图
  19. SEO优化 SEO基础
  20. html中不写form的后果,html之form

热门文章

  1. MySQL为什么错误选择代价更大的索引
  2. 小龙虾有寄生虫?煮熟了就没事
  3. web前端字体居中_html怎么让图片居中_WEB前端开发,html,文字居中
  4. GAN图像生成-pyotrch
  5. 【生活】通过哈勃望远镜看看你生日那天太空景象
  6. 关于ImageView.setBackgroundResource()方法不显示图片
  7. 建立Kubernates 1.24.4 Cluster
  8. python 合并两个csv文件
  9. Linux 安装 SVN
  10. java学习笔记Day3:数组