码迷,mamicode.com
首页 > 其他好文 > 详细

LintCode 111 Climbing Stairs

时间:2016-12-20 07:17:20      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:bin   i++   规划   方式   tair   details   斐波那契   动态规划   span   

这道题参考了这个网址: http://blog.csdn.net/u012490475/article/details/48845683

/*

首先考虑边界情况,当有1层时,有一种方法。 
然后再看2层时,有1+1、和2+0,两种方法。 
再看3层时,首先有两种选择:走一步或者走两步。 
如果走两步,那后面还剩一步可走; 
如果走一步,后面还剩两步可走,后面的方法即可等同于上面的2层情况。 
即可归纳出用C(i) = j; 表示n层时有j种可能。 
C(1) = 1; 
C(2) = 2; 
C(3) = C(3-2) + C(3-1); //因为只有两种选择. 
C(4) = C(4-2) + C(4-1); 
… 
C(n) = C(n-2) + C(n-1);

*/

 1 public int climbStairs(int n) {
 2         int a = 1;
 3         int b = 1;
 4         int c = 1;
 5         for(int i = 1; i < n; i++)
 6         {
 7             c = a + b;
 8             a = b;
 9             b = c;
10         }
11         return c;
12     }

上面的是iteration的做法,下面是递归,非常简洁。

1 public static int climbStairs(int n) {
2         // write your code here
3         if (n == 1) return 1;
4         else if (n == 2) return 2;
5         else return climbStairs(n - 1) + climbStairs(n - 2);
6     }

 另外看到Python的解法,更为简洁精妙

/*

经典的动态规划问题。每次上一个台阶或者两个台阶,问一共有多少种方法到楼顶。这个实际上就是斐波那契数列的求解。可以逆向来分析问题,如果有n个台阶,那么走完n个台阶的方式有f(n)种。而走完n个台阶有两种方法,先走完n-2个台阶,然后跨2个台阶;先走完n-1个台阶,然后跨1个台阶。所以f(n) = f(n-1) + f(n-2)。

*/

Ref: http://bookshadow.com/weblog/2015/08/23/leetcode-climbing-stairs/

 

LintCode 111 Climbing Stairs

标签:bin   i++   规划   方式   tair   details   斐波那契   动态规划   span   

原文地址:http://www.cnblogs.com/wenchan/p/6201207.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!