剑指OFFER 跳台阶

剑指OFFER 跳台阶

递归解法

class Solution {
    
public:
    int count = 0;
    
    void recur(int n)
    {
        if(n <= 1)
        {
            count++;
            return;
        }
        recur(n - 1);
        recur(n - 2);
    }
    
    int jumpFloor(int number) {
        recur(number);
        return count;
    }
};

二层递归

画出状态图,有点类似二叉树的遍历取叶子结点的个数。

1578631983046

动态规划解法

在写代码之前,先把问题捋清楚

1578631183655

这样就可以写出代码了

class Solution {
    
public:
    vector<int> dp;
    int jumpFloor(int number) {
        dp.resize(number+1);
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        int i;
        for(i=3;i<=number;i++)
        {
            dp[i] = dp[i-1]+dp[i-2];
        }
        return dp[number];
    }
};

变态跳台阶

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

比较普通跳台阶的写法

dp[i] = dp[i-1]+dp[i-2];//为跳一级或者两极台阶的写法,那么跳n级台阶的就是把之前所有的dp加起来就行了

给出完整代码

class Solution {
public:
    vector<int> dp;
    int jumpFloorII(int number) {
        dp.resize(number+1);
        dp[0] = 0;
        dp[1] = 1;
        dp[2] = 2;
        int i;
        for(i=3;i<=number;i++)
        {
            for(int j=0;j<i;j++)
            {
                dp[i] = dp[i] + dp[i-j];
            }
            dp[i] = dp[i] + 1;//青蛙甚至可以一次就调到最高那级台阶
        }
        return dp[number];
    }
};
posted @ 2020-01-10 12:58  virgil_devil  阅读(99)  评论(0编辑  收藏  举报