爬楼梯-ClimbingStairs
题目描述:
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相关推荐
- 《LeetCode力扣练习》第70题 爬楼梯 Java
<LeetCode力扣练习>第70题 爬楼梯 Java 一.资源 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶 ...
- [算法笔记] 爬楼梯
70.爬楼梯 https://leetcode-cn.com/problems/climbing-stairs/ 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有 ...
- 【LeetCode之C#解法】 移动零、爬楼梯
题目官网链接 https://leetcode-cn.com/problems/move-zeroes/ 283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非 ...
- 70. 爬楼梯 golang 斐波那契数列
题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: ...
- LeetCode 70. 爬楼梯(动态规划)
题目链接:https://leetcode-cn.com/problems/climbing-stairs/ 之前在递归中讲过这个问题,现在用动态规划求解. 假设你正在爬楼梯.需要 n 阶你才能到达楼 ...
- leetcode - 70. 爬楼梯
70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...
- java算法题走楼梯,程序员必学算法「动态规划」:爬楼梯(完全背包解法)
通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在电脑上学习,可以fork到自 ...
- Leetcode 70.爬楼梯
Time: 20190904 Type: Easy 考察:动态规划 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注 ...
- LeetCode两个爬楼梯题目解析(动态规划)
原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/m ...
最新文章
- url-pattern / /*匹配
- python数据处理实例-Python数据处理numpy.median的实例讲解
- Linux-Ubuntu Server 16.04安装JDK以及配置JDK环境变量
- 解决ncnn配置中缺少“vulkan”文件
- 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
- 【免费公测中】为数据赋予超能力,阿里云重磅推出Serverless数据分析引擎-Data Lake Analytics
- rtorrent -- PT机的下载利器
- ZBrush中的Clip剪切笔刷怎么快速运用
- Command line is too long. Shorten command line for Doc.generateAsciiDocs or
- bypass最新版d盾mysql_Bypass D盾_IIS防火墙SQL注入防御(多姿势)
- selenium webdriver 学习总结-元素定位
- 30个提高Web程序执行效率的好经验
- 类型字节oracle 增强型时间类型以及postgresql时间类型
- 解决 Error:No suitable device found: no device found for connection System eth0
- jQuery数据缓存功能的解析及简单实现
- 数据库sql中commit的重要性
- 2022-2028全球与中国无线电远程单元市场现状及未来发展趋势
- Airsim动态 | ROS教程(AirSim ROS Tutorial)
- 单例模式之懒汉式(三种代码实现)
- android中如何如何让dailog横屏显示