赞
踩
问题说明来源leetcode
难度中等1918
给定一个长度为 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
思考过程:
如果扫描一定范围,取其中的最大值来作为条约点可以不?
对于第一个点肯定是索引为0的,这个元素肯定是要计入的。
那么当拿到nums[0]了呢?
先对【0,nums[0]】范围的元素继续扫描,取最大的。
但是最大的好像不一定行,因为如果该最大值距离上一个踩点很近,
比如说
元素:5 4 3 2 1 2 3 3
索引:0 1 2 3 4 5 6 7
上面的结果对于第一次扫描到的4肯定不是结果
那么好像不是取最大的,而是???
对于范围【0,5】的元素,应该是考虑len - 1 - nums[i]的大小才对!
但是这样子真能找到最小跳跃步数吗?会不会还增加了一些步数?
1 . . . . . . 1 . . . . . ? . . 1 . . . . . . . 1
好像模拟不出来有什么情况,好像真的没问题。
那就这样
class Solution { public int jump(int[] nums) { if (nums.length == 1) return 0; int count = 0; int index = 0; for (int i = 1; i < nums.length; i++) { if (nums[index] < nums.length - index - 1){ count++; // 寻找下一个power,power 是使得len - nums[j] - j - 1最小的; int tmp = i; for (int j = i;j <= nums[index] + index; j++) { if ( nums.length - nums[j] - j <= nums.length - nums[tmp] - tmp) tmp = j; } i = nums[index] + index; index = tmp; }else { break; } } return count+1; } }
ok了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。