题目
假设你正在爬楼梯。需要 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 阶
题目解析
爬楼梯是一道非常典型的题目,既然题目可以提出问题,那我们也可以向计算机提出问题,这是一道非常典型的递归题目。本题同斐波那契数列,青蛙跳台阶等为同类问题。
第一遍
暴力解答,简洁优雅,然而这种方式并不能满足时间复杂度,从计算规律来看重复计算的次数较多。
class Solution {
public int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairs(n - 1) + climbStairs(n - 2);
}
}
第二遍
将重复的计算缓存起来呢,可以通过遍历实现,也可以通过递归实现,限制于题目和作者懒癌症状,此次解法使用遍历实现。
class Solution {
public int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int[] mem = new int[n];
mem[0] = 1;
mem[1] = 2;
for (int i = 2; i < n; i++) {
mem[i] = mem[i - 1] + mem[i - 2];
}
return mem[n-1];
}
}
第三遍
既然动态规划仅用到 i - 1 和 i - 2 那么不需要如此大的数组,仅需要保存前两项就好了。
class Solution {
public int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int a = 1, b = 2;
for (int i = 2; i < n; i++) {
int x = a + b;
a = b;
b = x;
}
return b;
}
}
网友评论