题目:爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
思考:
一下想到的是这道题可以用递归来做。第n阶可以从n-1阶走一步到达,也可以从n-2阶走2步到达。
同理n-1阶可以从n-2阶走一步或者从n-3阶走两步到达。
但是提交后发现时间和空间消耗太大。
实现:
class Solution {
public int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}
}
再思考:
先列举下几种情况:
n: 1 2 3 4 5
result: 1 2 3 5 8
从结果来看寻找规律发现:爬到n阶的方法总数等于爬到n-1阶的方法数加上爬到n-2阶的方法数,是一个斐波那契数列。
从3开始循环一直到n,n为3时result就等于1+2,2赋给pre(即n-2),3赋给pos(即n-1),如此循环到n即可得到n对应的result。
实现:
class Solution {
public int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
int pre = 1;
int pos = 2;
int result = 0;
for(int i=3;i<= n;i++){
result = pre + pos;
pre = pos;
pos = result;
}
return result;
}
}