携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
1. 引言
接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…
2. 题型
1.爬楼梯 前景: 假设你正在爬楼梯。需要 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
思路:
思路及算法
首先,这道题考的为方案统计数,可以采用多种组合的方式计算。在这里我们可以使用滚动数组的概念来解题。从0级开始爬时我们可以记作一种方案即:f(0) = 1;
从第 0 级到第 1 级也只有一种方案,即爬一级,f(1)=1;依次类推f(2)=2,f(3)=3,f(4)=5,……
设置滚动数组三个项,第一项和第二项默认为0,第三项为记录方案数项,为前两项和,初始值为1。循环数组项,每一次向前移动位置,r记录项为每次移动项后p和q的和值。
倒推可以得出,f(n) = f(n - 1) + f(n - 2)
还可以得出,当n <= 3时,f(n) == n
不停更新p,q,r的值,直到更新次数等于n,r即为f(n)的值,此题结束。
复杂度分析
时间复杂度:循环执行 n 次,每次花费常数的时间代价,故渐进时间复杂度为 O(n)。
空间复杂度:这里只用了常数个变量作为辅助空间,故渐进空间复杂度为 O(1)。
解答:
var climbStairs = function(n) {
let p = 0, q = 0, r = 1;
for (let i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
};