Jump Game II
Given array A = [2,3,1,1,4]Basic Idea:
Induction Rule: dp[i] = min{ dp[i + step] for step in (1 to nums[i]) } + 1; Base Case: dp[-1] = 0;class Solution { public int jump(int[] nums) { int[] dp = new int[nums.length]; Arrays.fill(dp, Integer.MAX_VALUE); dp[nums.length - 1] = 0; for (int i = nums.length - 2; i >= 0; --i) { int minStep = Integer.MAX_VALUE; for (int step = 1; step <= nums[i]; ++step) { if (i + step < nums.length && dp[i + step] < minStep) { minStep = dp[i + step]; } } dp[i] = minStep == Integer.MAX_VALUE ? Integer.MAX_VALUE : minStep + 1; } return dp[0]; } }class Solution { public int jump(int[] nums) { if (nums.length == 1) return 0; Deque<Integer> queue = new ArrayDeque<>(); queue.offerFirst(0); int step = 0; while (! queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; ++i) { int curr = queue.pollLast(); for (int j = 1; j <= nums[curr]; ++j) { if (curr + j < nums.length) { if (curr + j == nums.length - 1) return step + 1; else queue.offerFirst(curr + j); } } } step++; } return -1; } }例如,对于input:nums [2,3,1,1,4] 首先初始化 prevRight = 0, right = 0, step = 0 第一个点是 nums[0], 更新 right = 0+nums[0] = 2; 下一个是 nums[1], 因为 1>prevRight, step++, prevRight = right; 然后更新 right = 1+nums[1] = 4 此时 step=1,prevRight=2, right = 4, 已经到达end,返回 step=2class Solution { public int jump(int[] nums) { int prevRight = 0, right = 0; int step = 0; for (int i = 0; i < nums.length; ++i) { if (i > prevRight) { step++; prevRight = right; } if (i + nums[i] > right) { right = i + nums[i]; } } return step; } }