剑指offer9_变态跳台阶_题解

变态跳台阶

题目描述

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

示例1

输入

3

返回值

4

分析

方案一:递归

假设f(i)表示跳上i个台阶上可能的方法数。逆向思维。如果我从第n个台阶进行下台阶,下一步有n-1中可能,第1种:走到第n-1个台阶,第2种:走到第n-2个台阶,第n种:走到第0级台阶。

那么跳上n级台阶可能的方法数就是所有可能的总和

\[递推公式:f(n) = f(n-1) + f(n-2)+...+f(1)+f(0) \]

\[递归边界:f(0)=1 \]

/**
时间复杂度:O(n^2)
空间复杂度:递归栈的空间
**/
class Solution
{
public:
    int jumpFloorII(int number)
    {
        if (number == 0 || number == 1)
            return 1;
        vector<int> f(number + 1, 0);
        f[0] = 1;
        for (int i = 1; i <= number; i++)
        {
            for (int j = 0; j < i; j++)
            {
                f[i] += f[j];
            }
        }
        return f[number];
    }
};

方案二:记忆化搜索

\[递推公式:f(n) = f(n-1)+f(n-2)+...+f(0)\tag{1} \]

\[当n=n-1时有 \]

\[f(n-1)=f(n-2)+...+f(0)\tag{2} \]

\[将(2)代入(1)中得 \]

\[f(n)=2*f(n-1) \]

在递归过程中用数组将已经计算过的值保存下来

/**
时间复杂度:O(n)
空间复杂度:O(1)
**/
class Solution
{
public:
    int jumpFloorII(int number)
    {
        if (number == 0 || number == 1)
        {
            return number;
        }
        vector<int> f(number + 1, 0);
        f[0] = f[1] = 1;
        if (f[number] != 0)
        {
            return f[number];
        }
        for (int i = 2; i <= number; i++)
        {
            f[i] = f[i - 1] * 2;
        }
        return f[number];
    }
};

方案三:找规律

\(f(0)=f(1)=1\)

\(f(2)=2=2^1\)

\(f(3)=4=2^2\)

\(f(4)=8=2^3\)

\(...\)

\(f(n)=2^{n-1}\)

/**
时间复杂度:O(n)
没有重复计算
空间复杂度:O(1)
**/
class Solution
{
public:
    int jumpFloorII(int number) {
        return pow(2, number - 1);
    }
};
posted @ 2020-12-07 21:58  RiverCold  阅读(54)  评论(0编辑  收藏  举报