[LeetCode]70.Climbing Stairs
来源:互联网 发布:传世技能数据库 编辑:程序博客网 时间:2024/04/20 11:08
【题目】
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步。
每一次你都可以爬一步或者爬两步,问有多少种方式爬到楼顶?
【分析】
设 f (n) 表示爬 n 阶楼梯的不同方法数,为了爬到第 n 阶楼梯,有两个选择:
• 从第 n - 1 阶前进 1 步;
• 从第 n - 2 阶前进 2 步;
因此,有 f (n) = f (n - 1) + f (n - 2)。
这是一个斐波那契数列。
详细分析请参考:编程之美之斐波那契数列
【代码1】
// 递归class Solution {public: int climbStairs(int n) { return Fibonacci(n); }private: int Fibonacci(int n){ if(n <= 2){ return n; } return Fibonacci(n - 1) + Fibonacci(n - 2); }};
【代码2】
/********************************** 日期:2014-01-23* 作者:SJF0115* 题号: Climbing Stairs* 来源:http://oj.leetcode.com/problems/climbing-stairs/* 结果:AC* 来源:LeetCode* 总结:**********************************/#include <iostream>#include <stdio.h>#include <vector>using namespace std;// 迭代,时间复杂度 O(n),空间复杂度 O(1)class Solution {public: int climbStairs(int n) { int prev = 0; int cur = 1; for(int i = 1; i <= n ; ++i){ int tmp = cur; cur = prev + cur; prev = tmp; } return cur; }};int main() { Solution solution; int result; result = solution.climbStairs(40); printf("Result:%d\n",result); return 0;}
【代码3】
/********************************** 日期:2014-01-23* 作者:SJF0115* 题号: Climbing Stairs* 来源:http://oj.leetcode.com/problems/climbing-stairs/* 结果:AC* 来源:LeetCode* 总结:**********************************/#include <iostream>#include <stdio.h>#include <math.h>using namespace std;// 数学公式,时间复杂度 O(1),空间复杂度 O(1)class Solution {public: int climbStairs(int n) { double s = sqrt(5); return floor((pow((1+s)/2, n+1) + pow((1-s)/2, n+1))/s + 0.5); }};int main() { Solution solution; int result; result = solution.climbStairs(40); printf("Result:%d\n",result); return 0;}
【代码4】
/********************************** 日期:2014-01-24* 作者:SJF0115* 题号: Climbing Stairs* 来源:http://oj.leetcode.com/problems/climbing-stairs/* 结果:AC* 来源:LeetCode* 总结:**********************************/#include <iostream>#include <stdio.h>using namespace std;class Solution {public: //Fibonacci数列 int climbStairs(int n) { if(n == 0){ return 0; } int A[2][2] = {1,1,1,0}; //初始为单位矩阵 int Matrix[2][2] = {1,0,1,0}; //n = n - 1; for(; n ;n >>= 1){ //奇偶 if(n&1){ MatrixMulti(Matrix,A); }//if MatrixMulti(A,A); }//for return Matrix[0][0]; }private: //矩阵乘法 void MatrixMulti(int matrix[2][2],int matrix2[2][2]){ int a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0]; int b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1]; int c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0]; int d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1]; matrix[0][0] = a; matrix[0][1] = b; matrix[1][0] = c; matrix[1][1] = d; }};int main() { Solution solution; int result; for(int i = 1;i < 10;i++){ result = solution.climbStairs(i); printf("Result:%d\n",result); } return 0;}
2 0
- [LeetCode]70.Climbing Stairs
- LeetCode --- 70. Climbing Stairs
- [Leetcode] 70. Climbing Stairs
- [leetcode] 70.Climbing Stairs
- [leetCode]70. Climbing Stairs
- 70. Climbing Stairs LeetCode
- [LeetCode]70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- leetcode 70. Climbing Stairs
- leetcode 70. Climbing Stairs
- LeetCode *** 70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- LeetCode 70. Climbing Stairs
- leetcode 70. Climbing Stairs
- [LeetCode]70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- LeetCode 70. Climbing Stairs
- #leetcode#70.Climbing Stairs
- jxl使用
- myeclipse打war包
- Activity生命周期
- 更新数据库中某一列的值,让其在原数的基础上加N
- JSP调用JavaBean
- [LeetCode]70.Climbing Stairs
- Linux设置服务自启动
- mfc窗口继承
- 设计模式(13):迭代器模式
- Android源码学习之如何使用eclipse+NDK
- Failed to load JavaHL Library.
- 给easyui tree添加自定义属性
- 我希望你会好好的
- java海量数据处理