题目描述:

70. 爬楼梯

难度简单1975

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

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

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

示例 1:

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

示例 2:

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

通过次数604,724提交次数1,138,931

解决思想:

总结规律:n的种数=n-1的种数+n-2的种数;
那就递归啦;

直接递归太慢,因为有大量重复性操作:

    /*** 爬楼梯:* 总结规律:n的种数=n-1的种数+n-2的种数;* 那就递归啦;* 然而,这种写法,每一次的climbStairs()方法的参数都会导致从该参数递归到1和2一遍,大量的重复性操作;* @param n* @return*/public static int climbStairs(int n) {int out = 0;if (n == 1) {return 1;} else if (n == 2) {return 2;} else {out = climbStairs(n - 1) + climbStairs(n - 2);return out;}}

这种写法,每一次的climbStairs()方法的参数都会导致从该参数递归到1和2一遍,大量的重复性操作;

测试时发现速度特别慢。

解决办法:将每一次计算之后的数值保存起来,下次直接拿来用就行了

代码:

package zyh.springcloud.chapter2.service.impl.algorithm;import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;/*** @ClassName ClimbingStairs* @Author zhangyonghui* @Description 爬楼梯* @Date 2021/11/4 16:59* @Version 1.0**/
public class ClimbingStairs {public static void main(String[] args) {int n = 45;long start = System.currentTimeMillis();int out = climbStairs2(n);long end = System.currentTimeMillis();System.out.println("耗时 = " + (end - start));System.out.println("out = " + out);}/*** 上述方案存在重大缺陷,每一次的climbStairs()方法的参数都会导致从该参数递归到1和2一遍,大量的重复性操作;* 解决办法:将每一次计算之后的数值保存起来,下次直接拿来用就行了;* @param n* @return*/private static Map<Integer, Integer> hashMap = new HashMap<>();//private static Deque<Integer> stack = new LinkedList<>();static {hashMap.put(1, 1);hashMap.put(2, 2);//stack.push(1);//stack.push(2);}public static int climbStairs2(int n) {if (hashMap.containsKey(n)) {return hashMap.get(n);}else{// Integer pop = stack.pop();//for (int i = pop+1; i <= n; i++) {for (int i = 3; i <= n; i++) {if (!hashMap.containsKey(i)) {int stairs = climbStairs2(i - 1) + climbStairs2(i - 2);hashMap.put(i, stairs);//stack.push(i);}}return  hashMap.get(n);}}}

如果for循环不想用3开始,还可以用个辅助栈进行操作,不过可能消耗更多内存,进栈操作可能也费时,没测试具体耗时。

爬楼梯-ClimbingStairs相关推荐

  1. 《LeetCode力扣练习》第70题 爬楼梯 Java

    <LeetCode力扣练习>第70题 爬楼梯 Java 一.资源 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶 ...

  2. [算法笔记] 爬楼梯

    70.爬楼梯 https://leetcode-cn.com/problems/climbing-stairs/ 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有 ...

  3. 【LeetCode之C#解法】 移动零、爬楼梯

    题目官网链接 https://leetcode-cn.com/problems/move-zeroes/ 283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非 ...

  4. 70. 爬楼梯 golang 斐波那契数列

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

  5. LeetCode 70. 爬楼梯(动态规划)

    题目链接:https://leetcode-cn.com/problems/climbing-stairs/ 之前在递归中讲过这个问题,现在用动态规划求解. 假设你正在爬楼梯.需要 n 阶你才能到达楼 ...

  6. leetcode - 70. 爬楼梯

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

  7. java算法题走楼梯,程序员必学算法「动态规划」:爬楼梯(完全背包解法)

    通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在电脑上学习,可以fork到自 ...

  8. Leetcode 70.爬楼梯

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

  9. LeetCode两个爬楼梯题目解析(动态规划)

    原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/m ...

最新文章

  1. url-pattern / /*匹配
  2. python数据处理实例-Python数据处理numpy.median的实例讲解
  3. Linux-Ubuntu Server 16.04安装JDK以及配置JDK环境变量
  4. 解决ncnn配置中缺少“vulkan”文件
  5. 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
  6. 【免费公测中】为数据赋予超能力,阿里云重磅推出Serverless数据分析引擎-Data Lake Analytics
  7. rtorrent -- PT机的下载利器
  8. ZBrush中的Clip剪切笔刷怎么快速运用
  9. Command line is too long. Shorten command line for Doc.generateAsciiDocs or
  10. bypass最新版d盾mysql_Bypass D盾_IIS防火墙SQL注入防御(多姿势)
  11. selenium webdriver 学习总结-元素定位
  12. 30个提高Web程序执行效率的好经验
  13. 类型字节oracle 增强型时间类型以及postgresql时间类型
  14. 解决 Error:No suitable device found: no device found for connection System eth0
  15. jQuery数据缓存功能的解析及简单实现
  16. 数据库sql中commit的重要性
  17. 2022-2028全球与中国无线电远程单元市场现状及未来发展趋势
  18. Airsim动态 | ROS教程(AirSim ROS Tutorial)
  19. 单例模式之懒汉式(三种代码实现)
  20. android中如何如何让dailog横屏显示

热门文章

  1. 100条令人啼笑皆非的幽默墓志铭
  2. JSPatch 热更新
  3. logit regression
  4. 学完java学历不高工作能找吗_低学历学Java能找到工作吗?
  5. 【有利可图网】PS实战系列:巧用PS设计海报字体效果
  6. 火狐浏览器各版本的下载地址
  7. 计算机推免英语复试问题,干货:考研复试英语面试中最常被问到的7个问题,附上回答模板...
  8. 鱼眼摄像头的畸变矫正方法-python+opencv
  9. matlab处理视频代码,Matlab视频处理心脏跳动。代码补充
  10. docker 打包python 应用