【剑指offer】10.4 变态跳台阶

98 阅读1分钟

题目描述

在这里插入图片描述

// 10.4 变态跳台阶

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

题解

// 牛客
// 动态规划
// n级台阶,第一步有n种跳法:1,2,3,...,n,记为F(n)
// 跳1阶,剩下n-1阶,有F(n-1)种跳法
// 跳2阶,剩下n-2阶,有F(n-2)种跳法
// ...
// 跳n-1阶,剩下1阶,只有1中跳跳法
// 有:
// F(n) = F(n-1) + F(n-2) + ... + F(1) + 1
// F(n- 1) = F(n-2) + F(n-3) + .. + F(1) + 1
// ... 
// F(2) = F(1) + 1
// F(1) = 1
// 可以看到F(n)中的每一项都可以按一样的循环来展开。

// 运行时间:10ms
// 占用内存:9560k
import java.util.Arrays;
public class Solution {
    public int JumpFloorII(int target) {
        int[] f = new int[target];
        Arrays.fill(f, 1);
        for (int i = 1; i < target; i++){
            for (int j = 0; j < i; j++) {
                f[i] = f[i] + f[j];
            }
        }
        return f[target - 1];
    }
}

// 数学解
// f(n) = f(n-1) + f(n-2) + f(n-3) + .. + f(1)
// f(n-1) = f(n-2) + f(n-3) + .. + f(1)
// 所以有f(n) - f(n-1) = f(n-1),则,f(n)/f(n-1)=2,为等比数列,
// 根据定义可以计算第n项的值为f(1)*2^(n-1)
// 运行时间:10ms
// 占用内存:9688k
public class Solution {
    public int JumpFloorII(int target) {
        return (int) Math.pow(2, target - 1);
    }
}