1. 程式人生 > >[leetcode] 45. 跳躍遊戲 II(Java)(動態規劃)

[leetcode] 45. 跳躍遊戲 II(Java)(動態規劃)

com max https 重疊 http findmi 條件 leetcode scrip

45. 跳躍遊戲 II

動態規劃
此題可以倒著想。
看示例:
[2,3,1,1,4]
我們從後往前推,對於第4個數1,跳一次
對於第3個數1,顯然只能跳到第4個數上,那麽從第3個數開始跳到最後需要兩次
對於第2個數3,顯然一步到位,跳一次
對於第一個數2,只能選擇跳一次還是跳兩次,顯然選擇跳一次的收益更大,最終只需跳兩次

倒著推時發現滿足①最優子結構,②重疊子問題。可以使用動態規劃。

狀態描述:f[i]表示在第i個位置最小需要幾次可跳到最後一個位置
狀態轉移方程:f[i] = min(f[i+1]~f[nums[i]])+1
初始條件f[nums.length()-1]=0

class Solution {
    public int jump(int[] nums) {
        int f[] = new int[nums.length];
        if (nums.length == 0) {
            return 0;
        }
        if (nums.length == 1) {
            return 0;
        }
        f[nums.length - 1] = 0;
        for (int i = nums.length - 2; i >= 0; i--) {
            f[i] = findMin(f, i, nums[i]) + 1;
            if (f[i] < 0) f[i] = Integer.MAX_VALUE;
        }

        return f[0];

    }

    private int findMin(int[] f, int i, int num) {
        int min = Integer.MAX_VALUE;
        for (int j = 1; j <= num && i + j < f.length; j++) {
            min = Math.min(min, f[i + j]);
        }
        return min;
    }
}

[leetcode] 45. 跳躍遊戲 II(Java)(動態規劃)