JS Leetcode 70. 爬楼梯 题解分析,斐波那契数列与动态规划
本题来自LeetCode70. 爬楼梯,难度简单,属于一道动态规划的入门题,题目描述如下:
假设你正在爬楼梯。需要 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 阶
我们简单分析题目,然后解决此题。
贰 ❀ 斐波那契数列与动态规划
其实在JS 从斐波那契数列浅谈递归一文中,我就曾谈到过爬楼梯的问题,那时候18年,我还是个连算法是啥都不知道的小菜鸡...而这篇文章也记录了当时我对于爬楼梯的问题的思考,通过推导也简单介绍了斐波那契数列,以及如何利用递归解决此问题。但比较遗憾的是,当时的递归做法过于暴力,用于此题的答案会直接爆栈。所以这里我们尝试用动态规划的思路解决它。
对于动态规划,我们总是尝试将大问题拆分成小问题,站在小问题的角度推导动态转移公式,从而达到解决全局问题的目的,在上面的文章中其实也详细介绍了公式推导的过程(图文并茂!!),有兴趣可以看看,这里我们简单推导下这个过程:
因为题目说了爬楼梯一次只能走一格,或者两格,于是有了如下过程:
- 当只有一阶楼梯,只有1种方式。
- 当有两阶楼梯,我们可以1 1的爬,也可以直接2跨两阶,因此是2种方式。
- 三阶楼梯,我们可以1 1 1,1 2,或者2 1,因3种方式。
- 四阶楼梯,我们可以1 1 1 1,1 2 1,2 1 1,1 1 2,2 2,因此是5种。
如果你继续往下推导,会发现从三阶开始,这一阶爬楼梯的方式等于前两阶方式的和,因此我们得出公式,当然,我们得从第三阶开始才能满足。:
dp[i] = dp[i-1] + dp[i-2]
那么如何利用此公式解决这个问题呢?我们设想一想,假设有个数组,依次保存了每阶楼梯的爬法,那么如果要知道第 i 阶的有多少种方法,我们只要知道 [i-1]与[i-2]的方法的和即可,反过来说,我们知道了[i]的次数,那么它也能为后续的楼梯次数计算提供帮助。
/**
* @param {number} n
* @return {number}
*/
var climbStairs = function (n) {
// 特化处理,少于2直接返回
if (n <= 2) {
return n;
};
// 为了方便理解,我们i对应的就是第i阶的爬法,所以数组储存肯定是从1开始有效,因此得多简历一个,0位是废弃位。
let dp = new Array(n + 1);
//这两个是已知的,为后续计算服务
dp[1] = 1;
dp[2] = 2;
for (let i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
};
return dp[n];
};
上述代码应该是很直观的动态规划,i从3开始是因为第三阶开始才满足上述推导公式。而dp[1]与dp[2]的初始化,单纯是为了后续计算铺路,那么一道简单的爬楼梯就说到这里了。
JS Leetcode 70. 爬楼梯 题解分析,斐波那契数列与动态规划的更多相关文章
- LintCode题解之斐波纳契数列
直接使用递归的方法会导致TLE,加个缓存就好了: public class Solution { private Integer[] buff = new Integer[1000]; /* * @p ...
- 算法之路(三)----查找斐波纳契数列中第 N 个数
算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...
- 509. Fibonacci Number斐波那契数列
网址:https://leetcode.com/problems/fibonacci-number/ 原始的斐波那契数列 运用自底向上的动态规划最佳! 可以定义vector数组,但是占用较多内存空间 ...
- HDU 5914 Triangle 斐波纳契数列 && 二进制切金条
HDU5914 题目链接 题意:有n根长度从1到n的木棒,问最少拿走多少根,使得剩下的木棒无论怎样都不能构成三角形. 题解:斐波纳契数列,a+b=c恰好不能构成三角形,暴力就好,推一下也可以. #in ...
- 剑指offer-2:斐波那契数列
二.斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 1.递归法 1). 分析 斐波那契数列的标准公式为 ...
- [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式
题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...
- LeetCode 70 - 爬楼梯 - [递推+滚动优化]
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...
- JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...
- [LeetCode] 70. Climbing Stairs(斐波那契数列)
[思路] a.因为两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1); b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2) c.由a.b ...
- C#版 - 剑指offer 面试题9:斐波那契数列及其变形(跳台阶、矩形覆盖) 题解
面试题9:斐波那契数列及其变形(跳台阶.矩形覆盖) 提交网址: http://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tp ...
随机推荐
- KVM 管理工具:libvirt
libvirt 简介 libvirt 是目前使用最为广泛的对 KVM 虚拟机进行管理的工具和应用程序接口.
- Mysql 开启慢日志查询及查看慢日志 sql
本文为博主原创,转载请注明出处: 目录: 1.Mysql 开启慢日志配置的查询 2. 通过sql 设置Mysql 的慢日志开启 3. 通过慢 sql 日志文件查看慢 sql 1.M ...
- ClickHouse的Join算法
ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生.为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP ...
- Angular系列教程之单向绑定与双向绑定
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 解决Ubuntu 20.04下VS code无法使用中文输入法的问题
技术背景 在Ubuntu 20.04下,如果从应用商城中直接下载VS code,有可能会导致无法使用中文输入法的问题,那么就只能从其他地方写了中文再复制过来,非常的麻烦.从一些文章中收集到的信息来看, ...
- C++ list容器
一.前言 list容器,又称为双向链表容器,即该容器的底层是以双向链表的形式实现的,因此list容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中. list容器中各个元素的 ...
- 揭秘 Docker 网络:手动实现 Docker 桥接网络
本文将带领读者探索 Docker 桥接网络模型的内部机制,通过手动实现 veth pair.bridge.iptables 等关键技术,揭示网络背后的运作原理. 如果你对云原生技术充满好奇,想要深入了 ...
- JVM内存配置的再次思考
JVM内存配置的再次思考 摘要 最近研究过不少内存分配相关的处理 今天晚上突然感觉还不是非常系统. 还是想能够细致的在学习一下. 希望能够慢慢的拾遗,提高自己 操作系统内存的使用情况 本文主要想思考l ...
- [转帖]【JVM】线程安全与锁优化
线程安全 1.定义 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果 2. ...
- Sysbench的简单学习-编译与安装
sysbench的简单学习-编译与安装 摘要 github上面获取一下最新版本 https://github.com/akopytov/sysbench 注意现在 2023.2.17 最新版是 sys ...