剑指offer跳楼梯

63 篇文章 0 订阅
41 篇文章 0 订阅

//一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

//递归
class Solution1 {
public:
    int jumpFloor(int number) 
    {
        if (number<=1)
            return 1;

        return jumpFloor(number-1) + jumpFloor(number-2);
    }
};


/*
        f(n-1) + f(n-2)   n>=2
f(n) = 
        1                 n=1,0
*/
class Solution {
public:
    int jumpFloor(int number) 
    {
        if (number<=1)
            return 1;
        int tmp1 = 0,tmp2 = 0;
        map<int, int> ::iterator iter1 = mmap.find(number-1);
        map<int, int> ::iterator iter2 = mmap.find(number-2);
        if (iter1 == mmap.end())
        {
            tmp1 =jumpFloor(number-1);
            mmap[number - 1] = tmp1;
        }
        else
        {
            tmp1 = mmap[number - 1];
        }
        if (iter2 == mmap.end())
        {
            tmp2 =jumpFloor(number-2);
            mmap[number - 2] = tmp2;
        }
        else
        {
            tmp2 = mmap[number - 2];
        }
        return tmp1 + tmp2;

    }
    map<int,int> mmap;
};

class Solution2 {
public:
    int jumpFloor(int number) 
    {
        vector<int> vec(number+1, 0);
        vec[0] = 1;
        vec[1] = 1;
        for(int i=2; i<=number; i++)
        {
            vec[i] = vec[i-1] + vec[i-2];
        }
        return vec[number];
    }
};

//一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

//递归
class Solution {
public:
    int jumpFloorII(int number) 
    {
        int ret = 0;
        for (int i=1; i<number; i++)
        {
            ret += jumpFloorII(number-i);
        }
        return ++ret; 
    }
};


/*
        f(n-1) + f(n-2) + ....+f(1) +1  n>=2
f(n) = 
        1                               n=1
*/
class Solution {
public:
    int jumpFloorII(int number) 
    {
        int ret = 0;
        for (int i=1; i<number; i++)
        {
            int tmp1 , tmp2;
            map<int, int> ::iterator iter1 = mmap.find(number-i);
            if (mmap.end() == iter1)
            {
                tmp1 = jumpFloorII(number-i);
                mmap[number-i] = tmp1;
            }
            else
            {
                tmp1 = mmap[number-i];
            }
            ret += tmp1;
        }
        return ++ret; 
    }
    map<int,int> mmap;
};

class Solution {
public:
    int jumpFloorII(int number) 
    {
        vector<int> vec(number+1, 0);
        vec[1] = 1;
        for(int i=2; i<=number; i++)
        {
            vec[i] = accumulate(vec.begin(), vec.begin()+i, 0) + 1;
        }
        return vec[number];
    }
};

//将结果直接推导出
/*
        2^(n-1)  n>=1
f(n) = 
        0       ` n=0
*/
cla
class Solution {
public:
    int jumpFloorII(int number) 
    {
        if (0 == number)
            return 0;
        else
            return 1<<(number-1);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值