leetcode数组之Climbing Stairs(同剑指offer T9)

来源:互联网 发布:洛阳管家婆软件 编辑:程序博客网 时间:2024/06/06 14:29

题目】

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步。每一次你都可以爬一步或者爬两步,问有多少种方式爬到楼顶?
斐波那契数列应用:一个青蛙一次可以跳上1阶台阶,也可以跳上2阶台阶.求该青蛙跳上一个n阶台阶有多少跳法) 


设 f (n) 表示爬 n 阶楼梯的不同方法数,为了爬到第 n 阶楼梯,有两个选择:
• 从第 n  - 1 阶前进 1 步;
• 从第 n  - 2 阶前进 2 步;
因此,有 f (n) = f (n  - 1) + f (n  - 2)。

这是一个斐波那契数列。

//方法一:递归;计算量随着n的增大急剧增大,即时间复杂度是以n的指数方式增长的class Solution{public:    int climbStairs(int n)        {            return fibonacci(n);        }        private:    int fibonacci(int n)    {        if(n<=2)            return n;        else            return fibonacci(n-1)+fibonacci(n-2);    }};//方法二:迭代;时间复杂度 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;        }};  //方法三:数学公式时间复杂度 O(1),空间复杂度 O(1);(不是一种实用的方法)class Solution{public:    int climbStairs(int n)        {            const double s=sqrt(5);            return floor((pow((1+s)/2,n+1)+pow((1-s)/2,n+1)+0.5)/s);        }};

扩展:一只青蛙一次可以跳上1级台阶,2级台阶,···,n级台阶,则青蛙跳上一个n级台阶共有多少种跳法;

//方法一:总结可得法f(n)=2^(n-1);int climbStairs(int n){    if(n==0)        return 0;    int fn=(1<<(n-1));    return fn;}  //方法二:迭代;f(n)=f(n-1)+f(n-2)+···+f(1)+1;#include<iostream>using namespace std;int climbStairs(int n){    if(n==0)        return 0;    if(n==1)        return 1;    int fn=1;    for(int i=2;i<=n;i++)    {        int tmp=fn;        fn=fn+tmp;        tmp=fn;    }        return fn;}



0 0
原创粉丝点击