假设你正在爬楼梯。须要 n 阶你才能到达楼顶。数组
每次你能够爬 1 或 2 个台阶。你有多少种不一样的方法能够爬到楼顶呢?缓存
注意:给定 n 是一个正整数。bash
输入: 2
输出: 2
解释: 有两种方法能够爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶复制代码
输入: 3
输出: 3
解释: 有三种方法能够爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
复制代码
1 回溯,即 f(n) = f(n - 1)+ f(n - 2),直接回溯的话,leetcode上会超时,因此能够自定义一个缓存,用数组来保存结果。ui
2 动态规划,能够当作斐波那契数列来接,用递推的方式作,循环,从 f(1),f(0)开始加和到f(n)spa
class Solution {
public int climbStairs(int n) {
int[] memory = new int[n + 1];
return helper(n, memory);
}
private int helper(int n, int[] memory) {
if (n <= 2) {
return n;
} else if (memory[n] == 0) {
memory[n] = helper(n - 1, memory) + helper(n - 2, memory);
}
return memory[n];
}
}
复制代码
class Solution {
public int climbStairs(int n) {
int a = 0;
int b = 1;
for(int i = 1;i<=n;i++){
int c = a;
a = b;
b = c+b;
}
return b;
}
}复制代码
复制代码