45. 跳躍遊戲 IIcode
動態規劃 此題能夠倒着想。 看示例: [2,3,1,1,4] 咱們從後往前推,對於第4個數1,跳一次 對於第3個數1,顯然只能跳到第4個數上,那麼從第3個數開始跳到最後須要兩次 對於第2個數3,顯然一步到位,跳一次 對於第一個數2,只能選擇跳一次仍是跳兩次,顯然選擇跳一次的收益更大,最終只需跳兩次遊戲
倒着推時發現知足①最優子結構,②重疊子問題。可使用動態規劃。ip
狀態描述:f[i]表示在第i個位置最小須要幾回可跳到最後一個位置 狀態轉移方程:f[i] = min(f[i+1]~f[nums[i]])+1 初始條件f[nums.length()-1]=0leetcode
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; } }