leetcode 70. 爬楼梯问题(多种方法总结)
爬楼梯问题有多种出现形式,有不固定最多可跨阶数(即最多可跨阶数为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. 爬楼梯问题(多种方法总结)相关推荐
- Python描述 LeetCode 70. 爬楼梯
Python描述 LeetCode 70. 爬楼梯 大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端开发.pyt ...
- LeetCode 70爬楼梯71简化路径72编辑距离(dp)
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...
- leetcode - 70. 爬楼梯
70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...
- 变形版汉诺塔:LeetCode:70爬楼梯
70. 爬楼梯 题目链接:70:爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1 ...
- LeetCode - 70. 爬楼梯(人肉递归、动态规划)2
70 . 爬楼梯 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 ...
- LeetCode 70. 爬楼梯 (递归斐波那契 | 动态规划)
70. 爬楼梯 解法1 (暴力递归) 推出递推式子:f(n) = f(n - 1) + f(n - 2) 是一个斐波那契数列,用递归 class Solution {public int climbS ...
- Leetcode 70.爬楼梯
Time: 20190904 Type: Easy 考察:动态规划 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注 ...
- Leetcode 70. 爬楼梯 动态规划 c语言
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数.示例 1: 输入: 2 输出: 2 解释: 有两种 ...
- 84. Leetcode 70. 爬楼梯 (动态规划-基础题)
假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. 1. 1 阶 ...
最新文章
- android 锁屏画面开发,android 锁屏应用开发
- 关于在DataTable中执行DataTable.Select(条件)返回DataTable的解决方法
- Bitcoin ABC和区块上限——通过技术实现更大的区块
- linux rar工具
- FormData的使用
- js change事件 获取新值和旧值_前端总结(JS篇)
- windows Ctrl + Alt + 方向键 取消屏幕反转
- Spingboot定时任务与多线程
- HTTPBrowserCapabilities---在asp.net中显示浏览器属性
- java保留两位小数 四种方式
- IONIC打包安卓遇到COM.ANDROID.SUPPORT:SUPPORT-V4错误的解决办法
- Vue学习笔记之07-v-for循环遍历
- 使用include实现布局(layout)复用
- Transformer-XL 2
- 自适应波束形成matlab,自适应波束形成matlab
- 《李宗仁回忆录》完整版在线及电子书下载
- 丧钟为谁而鸣:AI步步逼近,华尔街23万人将失业
- JavaScript绘制矢量图
- SEO优化 SEO基础
- html中不写form的后果,html之form