算法(TS):爬楼梯

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

示例 1:

输入:n = 2

输出:2

解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入:n = 3

输出:3

解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

分析

由于一次只能爬一步或爬两步,那么第 n 阶只能从第 n-1 阶和第 n-2 阶转移得来,由于这里是统计方法数量,因此能推到出一个公式 f(n) = f(n - 1) + f(n -2)

解法一

scss 复制代码
function climbStairs(n: number): number {
    const step = (n: number): number => {
        if (n <= 1) {
            return 1
        } else {
            return step(n-1) + step(n-2)
        }
    }

    return step(n)
};

时间复杂度是 O(2^n)。这是最简单的写法,存在重复的计算,当 n 很大的时候会出现递归栈溢出的情况。

解法二

优化解法一,用一个 hash 表保存已经计算出的结果。

vbnet 复制代码
function climbStairs(n: number): number {
    const hash = new Map<number,number>([[0,1],[1,1]])
    const step = (n: number): number => {
        if (hash.has(n)) {
            return hash.get(n)
        }
        if (n <= 1) {
            hash.set(n,1)
            return 1
        } else {
            const i = step(n-2),j = step(n-1)
            hash.set(n-2,i)
            hash.set(n-1,j)
            return i + j
        }
    }

    return step(n)
};

时间复杂度O(n),空间复杂度O(n)

解法三

修改解法二。解法二将每一阶的计算结果都保存在 hash 中,通过 f(n) = f(n - 1) + f(n -2) 公式可知,在计算第 n 的时候,我们只需要知道前两阶的结果,可以使用函数的参数传递它们。

typescript 复制代码
function climbStairs(n: number): number {
    const step = (n: number,i: number,j: number): number => {
        if (n <= 1) {
            return j
        } else {
            return step(n-1,j,i + j)
        }
    }

    return step(n,1,1)
};

时间复杂度O(n),空间复杂度O(n)

解法四

前面三种解法都是从 n 计算到 1将结果累加,还能从 1计算到 n 将结果累加。

ini 复制代码
function climbStairs(n: number): number {
    let i = 1,j = 1, r = 1
    for(let k = 1; k < n; k++) {
        i = j
        j = r
        r = i + j
    }
    return r
};

时间复杂度O(n),空间复杂度O(1)

相关推荐
SHERlocked932 分钟前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
超级土豆粉4 分钟前
CSS3 的特性
前端·css·css3
星辰引路-Lefan5 分钟前
深入理解React Hooks的原理与实践
前端·javascript·react.js
怀旧,7 分钟前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
wyn2000112817 分钟前
JavaWeb的一些基础技术
前端
积极向上的向日葵20 分钟前
有效的括号题解
数据结构·算法·
GIS小天26 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
Hygge-star31 分钟前
Flask音频处理:构建高效的Web音频应用指南
前端·flask·音视频·pygame·csdn开发云
江城开朗的豌豆42 分钟前
JavaScript篇:回调地狱退散!6年老前端教你写出优雅异步代码
前端·javascript·面试
_Itachi__1 小时前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵