笔试题——变态跳台阶

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

思考:在台阶数少的时候,可以手动计算一下跳台阶的跳法。

台阶数 = 1时,

1 总共1种

台阶数 = 2时,

1 + 1, 2 总共2种

台阶数 = 3时,

1 + 1 + 1, 1 + 2,  2 + 1, 3 总共4种

台阶数 = 4时,

1 + 1 + 1 + 1, 1 + 1 + 2, 1 + 2 + 1,  2 + 1 + 1, 2 + 2, 3 + 1, 1 + 3, 4 总共8种

另台阶数为1时的跳法为f(1), 台阶数为2时的跳法为f(2), 台阶数为3时的跳法为f(3),以此类推,台阶数为n时的跳法为f(n)。

f(1) = 1; f(2) = 2; f(3) = 4; f(4) = 8...

可以找到以下规律,

f(1) = 1

f(2) = f(1) + 1 = 1 + 1 = 2

f(3) = f(2) + f(1) + 1 = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + 1 = 4 + 2 + 1 + 1 =8

可以另f(0) = 1, 能够发现以下规律

f(1) = f(0)

f(2) = f(1) + f(0) = 1 + 1 = 2

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4

f(4) = f(3) + f(2) + f(1) + f(0) = 4 + 2 + 1 + 1 =8

以此类推,可以得出

f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)

编程书写情况和运行结果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        vector<int> f(number + 1);
        f[0] = 1;
        f[1] = 1;
        for(int i = 2; i <= number; i++) {
            f[i] = 0;
            for(int j = 0; j < i; j++) {
                f[i] += f[j];
            }
        }
        return f[number];
    }
};

以上代码测试结果,运行时间:2ms 占用内存:480K

当然,此题还有更优解法

例如,把f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)继续优化

f(n - 1) = f(n - 2) + f(n - 3) + ... + f(2) + f(1) + f(0)

f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

当n = 1,f(1) = 1;

当n > 1, f(n) = f(n - 1) + f(n - 1) = 2 * f(n - 1)

编程书写情况和运行结果如下所示,

class Solution {
public:
    int jumpFloorII(int number) {
        if(number == 1) {
            return 1;
        }
        else {
            return 2 * jumpFloorII(number - 1);
        }
    }
};

以上代码测试结果,运行时间:4ms 占用内存:476K

猜你喜欢

转载自blog.csdn.net/CSDN_JKing/article/details/81255055
今日推荐