剑指offer刷题记录9——变态跳台阶

题目描述:

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

跳上n级台阶的问题可以化成从第n-1,n-2,...,1,0级台阶直接跳上来的跳法加在一起,最终所有跳法的原点一定是从第0级台阶开始跳,所以循环的终止条件为target>=0

解法一:

public class Solution {
    public int JumpFloorII(int target) {
        int num = 0;
        if(target == 0) {
            return 1;
        }
        while(target >= 0) {
            num += JumpFloorII(--target);
        }
        return num;
    }
}

运行时间:29ms

占用内存:9264k

进一步进行优化,因为f(x) = f(x - 1) + f(x - 2) + ... + f(0),而f(x)减去f(x - 1)剩下的那一坨刚好等于f(x - 1),所以f(x) = 2 * f(x - 1),所以有下面的解法。

解法二:

public class Solution {
    public int JumpFloorII(int target) {
        if(target == 1) {
            return 1;
        }
        int num = 1;
        while(--target > 0) {
            num *= 2;
        }
        return num;
    }
}

运行时间:17ms

占用内存:9336k

猜你喜欢

转载自blog.csdn.net/qq_37684824/article/details/82891348
今日推荐