LeetCode每日一题:爬楼梯(No.70)

1,226 阅读1分钟

题目:爬楼梯


 假设你正在爬楼梯。需要 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;
}

}