给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/jump-game-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种方法,慢的,两层循环。
class Solution { public int jump(int[] nums) { int step = 0 ; int position = nums.length - 1 ; while(position > 0){ for(int i = 0 ; i < position ; i ++){ if(nums[i] + i >= position){ step ++ ; position = i ; break ; } } } return step ; } }主要思路是:从后往前检索,找到那个离最后元素最远的,又能符合条件的元素的位置(内层循环,从前往后找到符合条件的位置),然后,把他最为新的最后的元素。再继续循环。
第二种方法:
class Solution { public int jump(int[] nums) { int step = 0 ; int end = 0 ; int maxposition = 0 ; for(int i = 0 ; i < nums.length - 1 ; i ++ ){ maxposition = Math.max(maxposition,nums[i] + i); if(i == end){ end = maxposition ; step ++ ; } } return step ; } }这种方法是一层循环 。 从前往后检索。用找到每一个元素能跳的最远的地方,记为边界,然后从当前位置开始遍历数组(找到再该区间内的元素,能到达的最远的位置),到达边界后,更新边界为前面说的最远的位置,并且把step加一。
困难难度的题,有点不好理解。还需要再看看。