给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
这道题比较简单,因为有这个条件:假设你总是可以到达数组的最后一个位置。
那么我们只需要每次都尽量的多跳,最后一定会到达终点
那么如何每次尽量多跳呢?
在每个位置能跳到的范围内,去找能跳的最远距离。
最远距离max = j + nums[j + i];其中 j 是跳的距离,nums[i + j]是跳到的位置能跳的距离。即预期最大收益化往后跳的距离。
例如 2 3 1 1 4,对于nums[0] = 2 ,他能跳到 3 和 1.
class Solution { public int jump(int[] nums) { if(nums.length <= 1)return 0; int[] dp = new int[nums.length]; int max = 0; int ans = 0; for(int i = 0; i < nums.length; i++){ int j = 0; int nextStep = 0; max = 0; if(i + nums[i] >= nums.length - 1){ ans++; break; } for(; j <= nums[i];j++){ if(j + nums[j + i] > max) { nextStep = j; max = j + nums[i + j]; } } ans++; i = nextStep + i - 1; } return ans; } }