Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

利用递归的思想:逆向思想。如果你想上到第n个台阶,有几种可能?答案是,2种可能:从(n-1)号台阶跨一阶上来,或是,从(n-2)号台阶一步跨两阶上来。所以,climbStairs(n) = climbStairs(n-1) + climbStairs(n-2)。那么收敛条件是什么呢? 很容易:n=1时只有一种可能;n=2时有2种可能;n=3时,等于climbStairs(2) + climbStairs(1) = 1+2 =3; ……

所以代码为:

    public int climbStairs(int n) {
        if(n == 1) return 1;
        if(n == 2) return 2;
        return climbStairs(n-1) + climbStairs(n-2);
    }

这时我以为已经做完了,以跑,发现超时了。好吧,那就优化一下吧。

在递归算法中由于是不断重复调用方法本身,所以有太多的计算是重复的了。一种非常常见的优化递归的算法就是建一个表,把计算过的结果保存其中,如果下次发现又要计算这个参数的结果,直接从表中查找就好了,不用重复计算了:

public class Solution {
    private int[] buffer = new int[100];

    public int climbStairs(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        if(n == 2) return 2;
        if(buffer[n] == 0){
            buffer[n] = climbStairs(n-1) + climbStairs(n-2);
        } 
        return buffer[n];
    }   
}

这一次就没有超时了。顺便说一下,我这里用的表只是一个简单的固定长度的数组,根据应用的需要,有点时候还可以把这种表用队列(先进先出)或是动态数组(大小可增长)的形式保存。

你可能感兴趣的:(Climbing Stairs)