【LeetCode练习题】Climbing Stairs
2014-04-04 17:46
387 查看
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步到达楼梯的顶部。每一次你只能上一个或两级台阶,问要到达顶部一共有多少种方法?
解题思路:
真是太巧了!!我今天刚刚在《剑指offer》里读到了一模一样的原题,在该书的75页。简单介绍一下吧:
如果只有一级台阶,那显然只有一种方法。如果有2级台阶,那就有两种上的方法了:一种是分两次,每次上一级;另外一种就是一次上2级。
接着讨论一般情况,我们把n级台阶时的方法数看成是n的函数,记为f(n)。当n>2时,第一次上的时候就有两种不同的选择:一是第一次只登一级,此时登法数目等于后面剩下的n-1级台阶的登法数目,即f(n-1);另外一种选择是第一次上2级,此时方法数目等于后面剩下的n-2级台阶的方法数目,即f(n-2)。因此n级台阶的不同登法总数等于f(n-1)+f(n-2)。不难看出这实际上就是斐波那契数列了。
注:因为斐波那契解法大都采用递归,实际上递归的解法存在很严重的效率问题,有大量的重复计算。当要计算的数很大时,速度极慢且有可能出现函数调用栈溢出的情况。所以实用的解法是采用循环,时间复杂度是O(n)。
代码如下:
class Solution { public: int climbStairs(int n) { return Fibonacci(n); } int Fibonacci(int n){ int result[2] = {1,2}; if(n < 3){ return result[n-1]; } int NminusOne = 2; int NminusTwo = 1; int N = 0; for(int i = 3; i <= n; i++){ N = NminusOne + NminusTwo; NminusTwo = NminusOne; NminusOne = N; } return N; } };
相关文章推荐
- [leetcode][DP] Climbing Stairs
- [LeetCode][智力题]Climbing Stairs
- leetcode_Climbing Stairs
- LeetCode--Climbing Stairs
- [Leetcode] Climbing Stairs
- [LeetCode] [Climbing Stairs 2012-04-03]
- LeetCode: Climbing Stairs
- LeetCode 70 Climbing Stairs(记忆化搜索)
- LeetCode-Climbing Stairs
- Leetcode: Climbing Stairs
- leetcode Climbing Stairs
- Leetcode:Climbing Stairs
- [Leetcode]Climbing Stairs
- LeetCode——Climbing Stairs
- LeetCode练习-Climbing Stairs
- leetcode - Climbing Stairs
- leetcode[68] Climbing Stairs
- leetcode 70 Climbing Stairs
- Leetcode 70 Climbing Stairs
- [LeetCode练习题-C语言] 25. Reverse Nodes in k-Group