动态规划简单2 种解法

#JZ71跳台阶扩展问题

每次可跳 1 到 n 级,计算跳上 n 级台阶的不同方法数。

#动态规划#数学#牛客

解题主线

01

f(n)=f(0)+f(1)+...+f(n-1),并约定 f(0)=1 作为递推空前缀。

02

由相邻两式可得 n>=2 时 f(n)=2f(n-1),因此正整数 n 的答案为 2^(n-1)。

解法 1枚举最后一步动态规划

对每一级 i,累加所有较低台阶 j 的方案数。

时间复杂度

O(n²)

空间复杂度

O(n)

JZ71. 跳台阶扩展问题 · 枚举最后一步动态规划
final class Solution {
    public int jumpFloorII(int n) {
        if (n <= 0) return 0;
        int[] ways = new int[n + 1];
        ways[0] = 1;
        for (int step = 1; step <= n; step++) {
            for (int previous = 0; previous < step; previous++) {
                ways[step] = Math.addExact(ways[step], ways[previous]);
            }
        }
        return ways[n];
    }
}

对每一级 i,累加所有较低台阶 j 的方案数。

解法 2递推式压缩

从 f(1)=1 开始,每增加一级就把方案数翻倍。

时间复杂度

O(n)

空间复杂度

O(1)

JZ71. 跳台阶扩展问题 · 递推式压缩
final class Solution {
    public int jumpFloorII(int n) {
        if (n <= 0) return 0;
        int ways = 1;
        for (int step = 2; step <= n; step++) ways = Math.multiplyExact(ways, 2);
        return ways;
    }
}

从 f(1)=1 开始,每增加一级就把方案数翻倍。

  • 用整数递推替代旧代码的 Math.pow 强转,避免浮点精度与静默溢出。

边界与易错点

  • 这是 Q070 文件中混入的牛客 JZ71,不应算作 LeetCode 70 的另一种解法。
  • Math.pow 使用 double,整数边界附近可能丢失精度;应使用整数递推并检测 int 溢出。
整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

easy/Q070_jumpFloor_np.java