您的位置:首页 > 大数据 > 人工智能

Climbing Stairs

2016-03-07 18:02 477 查看
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
== 0){
buffer
= climbStairs(n-1) + climbStairs(n-2);
}
return buffer
;
}
}


这一次就没有超时了。顺便说一下,我这里用的表只是一个简单的固定长度的数组,根据应用的需要,有点时候还可以把这种表用队列(先进先出)或是动态数组(大小可增长)的形式保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: