题目描述

假设你正在爬楼梯。需要 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 阶

思路

每次可以爬 1 或 2 个台阶。当我们爬 4 个台阶时,就是爬 3 个台阶的方法数,加上爬 2 个台阶的方法数,等于 F(3) + F(2) = 3 + 2 = 5。所以当我们爬 N 个台阶,就有 F(N - 1) + F(N - 2) 种方法。

解决方案

方案一:暴力破解

我们可以用递归的方法得到所有小于N的方法数,并把它们相加得出结果。递归结束的标志为 N=1 或 N =2。

var climbStairs = function(n) {
if (n == 1) return 1
if (n == 2) return 2
return climbStairs(n - 1) + climbStairs(n - 2)
};

时间复杂度 O($2^n$)。这种暴力解题的方法会超出时间限制,显然不是我们想要的。

方案二:优化暴力破解

从上一种方法我们可以发现,每一步的结果都做了上一步的重复计算。比如F(6) + F(5) 后会计算 F(5) + F(4),F(5) 我们已经计算过了,就不要重复计算了。所以我们可以用一个数组来储存计算结果,方便重复利用。

var climbStairs = function(n) {
let arr = []
function climb(n) {
if (n == 1) return 1
if (n == 2) return 2
if (arr[n] > 0) return arr[n] arr[n] = climb(n - 1) + climb(n - 2)
return arr[n]
}
return climb(n)
};

时间复杂度 O(n),优化之后提高了速度,已经不会超出时间限制了。

方案三:问题分解

和递归的思路一样,把一个大问题分解成多个小问题,只是这次我们使用循环的方式,减少内存的开销。

var climbStairs = function(n) {
if (n == 1) return 1
if (n == 2) return 2 let arr = []
arr[1] = 1
arr[2] = 2
for (let i = 3; i<= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2]
}
return arr[n]
};

时间复杂度 O(n),优化了内存的消耗,速度没有提升。

方案四:斐波那契数

从上一个方案我们可以看出这是一个斐波那契数列。

var climbStairs = function(n) {
if (n == 1) return 1
if (n == 2) return 2 let first = 1
let second = 2
for (let i = 3; i<= n; i++) {
let third = first + second
first = second
second = third
}
return second
};

时间复杂度 O(n)

LeetCode70——爬楼梯的更多相关文章

  1. leetcode-70.爬楼梯

    leetcode-70.爬楼梯 Points 斐波那契 动态规划 题意 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给 ...

  2. [Swift]LeetCode70. 爬楼梯 | Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  3. leetCode70.爬楼梯

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

  4. Java实现 LeetCode70 爬楼梯

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

  5. 手撕代码:leetcode70爬楼梯

    装载于:https://blog.csdn.net/qq_35091252/article/details/90576779 题目描述 假设你正在爬楼梯.需要n阶你才能到达楼顶. 每次你可以爬1或2个 ...

  6. leetcode70 爬楼梯 Python

    组合数学Fibonacci 例3.4.1   (上楼梯问题)某人欲登上n级楼梯,若每次只能跨一级或两级,问他从地面上到第n级楼梯,共有多少种不同的方法? (解)设上到第n级楼梯的方法数为an.分类统计 ...

  7. 【leetcode70】【动态规划】 爬楼梯

    (1 pass 一维动态规划) 爬楼梯(easy) 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数 ...

  8. 爬楼梯问题 leetcode70

    假设你正在爬楼梯,需要n阶你才能到达楼顶,n是正整数 每次你可以爬1或2个台阶,有多少种不同的方法可以爬到楼顶 当n=1时,steps=1 当n=2时,1+1,2 steps=2 当n=3时,1+1+ ...

  9. LeetCode 70. 爬楼梯(Climbing Stairs)

    70. 爬楼梯 70. Climbing Stairs 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 ...

随机推荐

  1. idea启动项目连接mysql数据库后台报duplicate name异常

    自己写的sql语句在MySQL数据库中运行是没有问题的 但是在使用idea启动项目的时候,后台在运行这行sql语句的时候居然报错了,duplicate name:重复的名字,最后自己经过思考,修改了一 ...

  2. Java逆变(Covariant)和协变(Contravariant)

    1. 定义 逆变和协变描述的经过类型变换后的类型之间的关系.假如A和B表示类型,f表示类型变换,A ≤B表示A是B的子类型,那么 如果A ≤B,f(A) ≤f(B),那么f是协变 如果A ≤B,f(B ...

  3. MongoDB 几种查询嵌套数据(Embedded)的方式(转载)

    前言 MongoDB 推荐使用「内嵌文档(Embedded)」,所以带来一个问题,如何查询嵌入文档内的数据? 假如我们有一个 storage 的 Collection,包含一条数据: // `stor ...

  4. Numpy | 14 字符串函数

    本章函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内置库中的标准字符串函数. 这些函数在字符数组类(n ...

  5. ArrayList :货物库存管理(遍历)

        package com.oracle.demo01; import java.util.ArrayList; import java.util.Scanner; public class De ...

  6. ent 基本使用八 索引

    我们可以在ent 的schema 中定义index 可以方便的控制数据约束,使用索引可以加速我们的访问以及数据的唯一性处理 配置字段索引 多字段索引 package schema ​ import ( ...

  7. HNOI2015总结

    // 此博文为迁移而来,写于2015年4月21日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vy9t.html 这次省 ...

  8. nginx php-fpm 配置问题(2)

    问题: Nginx/FPM/PHP all php files say 'File not found.' 解决: 可能情况 1: 在 nginx php-fpm 配置问题(1)文中,我们分析了一种可 ...

  9. 数据结构(一)二叉树 & avl树 & 红黑树 & B-树 & B+树 & B*树 & R树

    参考文档: avl树:http://lib.csdn.net/article/datastructure/9204 avl树:http://blog.csdn.net/javazejian/artic ...

  10. 【面向对象】第三单元总结——JML

    梳理JML语言的理论基础.应用工具链情况 JML语言理论基础 JML(Java Modeling Language)是一种行为规范接口语言,通过使用不会被编译的注释形式,和固定关键字的语法,指定Jav ...