【题目】
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;
}