因为困难多丧志,不叫红尘惑坚心
—— 24.3.25
爬楼梯
提示
假设你正在爬楼梯。需要
n
阶你才能到达楼顶。每次你可以爬
1
或2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
动态规划
思路和算法
在只有第一层和第二层楼梯时,上楼的方案我们已知,当n>=3时,采用斐波那契数列,f(n)=f(n-1)+f(n-2)
所以对n进行判断,可以直接解得题目
青蛙跳台问题与斐波那契数列问题的区别在于起始值不同:
青蛙跳台阶问题: f(0)=1 , f(1)=1 , f(2)=2 。
斐波那契数列问题: f(0)=0 , f(1)=1 ,f(2)=1 。若新建长度为 n 的 dp 列表,则空间复杂度为 O(N)。
由于 dp 列表第 i 项只与第 i−1 和第 i−2 项有关,因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum 使 a,b 两数字交替前进即可 (具体实现见代码) 。由于省去了 dp 列表空间,因此空间复杂度降至 O(1)。
class Solution {
public int climbStairs(int n) {
int a = 1, b = 1, sum; //初始值
for(int i = 0; i < n - 1; i++){ //循环进行遍历
sum = a + b; //第三层等于前两层之和
a = b; //第一层等于第二层
b = sum; //第二层等于原先第一层与第二层之和
}
return b;
}
}