假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
思路:第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去 递推公式: f(n) = f(n-1) + f(n-2)
class Solution {
//方法一:记忆递归 O(n) O(n)
public int climbStairs1(int n) {
int[] memo = new int[n+1];
return climbStairsMemo(n,memo);
}
private int climbStairsMemo(int n,int[] memo) {
//1.爬到第n级的台阶已经计算过了,直接返回
if(memo[n] > 0) {
return memo[n];
}
//2.计算爬第N级台阶的方法有多少种
if(n==1){
return 1;
} else if(n==2) {
return 2;
}else{
memo[n] = climbStairsMemo(n-1,memo) + climbStairsMemo(n-2,memo);
}
return memo[n];
}
//方法二:斐波那契数列 O(n) O(1)
public int climbStairs(int n) {
if(n==1) return 1;
int first = 1;
int second = 2;
for(int i = 3; i <= n;i++) {
int tmp = first + second;
first = second;
second = tmp;
}
return second;
}
}
进阶 : 每次你可以爬 1 或 4 个台阶呢。你有多少种不同的方法可以爬到楼顶呢?
进阶: 每次你可以爬 1 或 9 个台阶呢。你有多少种不同的方法可以爬到楼顶呢?
分析: 改变了第二种走法的台阶数递推公式还适用吗 ? 其实还是适用的 具体可以看下面的推导 不要被改变一个值迷惑
//1 1
//2 1
//3 1
//4 2
//5 11111 14 41 3
//6 111111 141 114 411 5
//7 (n-1)+(n-2) 8
网友评论