假设你正在爬楼梯。需要 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.自己的解法:动态规划。用f(n)来表示爬n阶台阶的可能性,则如果第一次爬一个台阶,则剩下n-1阶的可能性是f(n-1),如果第一次爬两个台阶,则剩下n-2阶的可能性是f(n-2),则有
f(n)=f(n-1)+f(n-2)
因为从上往下计算的话,会产生很多重复的计算,因此利用一个辅助数组来存储中间结果,可以实现从下往上的计算方式。
class Solution {
public int climbStairs(int n) {
int[] counts = new int[n];//用一个辅助数组来存储每一个台阶的可能次数
if(n >= 1){
counts[0] = 1;//只有一个台阶的话就是一种可能
}
if(n >= 2){
counts[1] = 2;//两个台阶的话是两种可能
}
//从下往上计算,保存中间的计算结果,可以减少很多计算量
for(int i = 2;i < n;i++){//循环计算每个台阶的可能数
counts[i] = counts[i-1] + counts[i-2];
}
return counts[n-1];//返回结果
}
}
2.优化辅助空间。
class Solution {
public int climbStairs(int n) {
// 跟斐波那契数列一样
if(n <= 2) return n;
int a = 1, b = 2, sum = 0;
for(int i = 3; i <= n; i++){
sum = a + b;
a = b;
b = sum;
}
return sum;
}
}
题源:力扣