剑指offer跳楼梯

//一只青蛙一次可以跳上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);
    }
};

猜你喜欢

转载自blog.csdn.net/pynash123/article/details/88868999