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; ……
所以代码为:
这时我以为已经做完了,以跑,发现超时了。好吧,那就优化一下吧。
在递归算法中由于是不断重复调用方法本身,所以有太多的计算是重复的了。一种非常常见的优化递归的算法就是建一个表,把计算过的结果保存其中,如果下次发现又要计算这个参数的结果,直接从表中查找就好了,不用重复计算了:
这一次就没有超时了。顺便说一下,我这里用的表只是一个简单的固定长度的数组,根据应用的需要,有点时候还可以把这种表用队列(先进先出)或是动态数组(大小可增长)的形式保存。
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 ; } }
这一次就没有超时了。顺便说一下,我这里用的表只是一个简单的固定长度的数组,根据应用的需要,有点时候还可以把这种表用队列(先进先出)或是动态数组(大小可增长)的形式保存。
相关文章推荐
- 李开复预测人机世纪大战:人工智能获胜概率很悬
- 李开复预测人机世纪大战:人工智能获胜概率很悬
- GenerateNewFileThroughDeleteDataByHaijian
- netstat下time_wait数过多引起的问题
- leetcode 每日一题 217. Contains Duplicate
- lintcode-easy-Trailing Zeros
- 直线mian函数跳转到mainret = main(argc, argv, envp);
- 五子棋AI算法第七篇-Zobrist
- Linux下“read failed after 0 of 4096 at 0: Input/output error”
- URAL 1017 Staircases 楼梯
- VC6.0 error LNK2001: unresolved external symbol _main解决办法
- process launch failed: Security 解决方案
- Rails
- 1106. Lowest Price in Supply Chain (25)
- 利用thumbnailer API来提取图标视频或专辑的thumbnail
- poj 1995 Raising Modulo Numbers(快速幂模板)
- sendmail使用
- [leetcode] 11. Container With Most Water
- 可伸缩性, 可用性和稳定性模式 Scalability, Availability & Stability Patterns
- saiku - 优化多维度查询效率