题目
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素nums[i]表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
- 0 <= j <= nums[i]
- i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
示例
示例1
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例2
输入: nums = [2,3,0,1,4]
输出: 2
提示
1 <= nums.length <= 104
0 <= nums[i] <= 1000
- 题目保证可以到达
nums[n-1]
class Solution { public int jump(int[] nums) { int jumps = 0; int currentEnd = 0; int farthest = 0; for(int i = 0;i < nums.length - 1; i++){ farthest = Math.max(farthest,i + nums[i]); if(i == currentEnd){ jumps++; currentEnd = farthest; } } return jumps; } }
详细解读
这是一个经典的贪心算法问题。你可以使用贪心算法来找到到达数组的最后一个元素的最小跳跃次数。
这个算法的核心思想是维护两个指针 currentEnd
和farthest
,分别表示当前跳跃范围的结束位置和在这个范围内可达的最远位置。遍历数组时,不断更新 farthest
,表示在当前范围内可以跳得更远。
当遍历到 i == currentEnd
时,表示需要进行下一次跳跃,此时将 jumps
增加1,同时将 currentEnd
更新为 farthest
,表示下一次跳跃的范围。
最终,当遍历完整个数组后,jumps
就表示到达数组最后一个元素的最小跳跃次数。
这个算法具有线性时间复杂度 O(n),其中 n 是数组的长度,因为只需一次遍历数组。它是一种高效的解决方案用于解决跳跃游戏问题。