跳跃游戏 II
规则同跳跃游戏,但要输出的是最少跳跃次数。
之前那种思路仍然可行,我们的领域就是靠一步一步对应拓展的,虽然可以考虑到有些进展慢的路线并不会落在新增区间内,但那并不影响,因为我们求的是最快路线。
我先是稍微修改了一下之前的代码,发现不行
class Solution {
public int jump(int[] nums) {
if(nums.length <= 1) return 0;
int reach = nums[0];
int pre = 0;
int count = 1;
while(reach < nums.length - 1 && !(reach == pre)) {
pre = reach;
count++;
for (int i = 0; i <= reach; i++) {
if(reach >= nums.length - 1) return count;
if(i + nums[i] > reach) reach = i + nums[i];
}
}
return count;
}
}
我意识到之前并不是按照一步一步来推进的,和我的设想有出入,我的reach在往前迈一步的一次遍历中就会有变化,但是因为之前讨论的是能否到达所以这一点被掩盖了,而且看起来反而是一种优化🤗
那么我们就把每一次的reach定格一下好了。
class Solution {
public int jump(int[] nums) {
if(nums.length <= 1) return 0;
int reach = nums[0];
int pre = 0;
int count = 1;
while(reach < nums.length - 1 && !(reach == pre)) {
pre = reach;
count++;
int temp = reach;
for (int i = 0; i <= temp; i++) {
if(reach >= nums.length - 1) return count;
if(i + nums[i] > reach) reach = i + nums[i];
}
}
return count;
}
}
暂时想不到如何进一步优化,看看解析,我发现之前跳跃 I 的解法就可以进一步优化(当时没注意)
class Solution {
public int jump(int[] nums) {
if(nums.length <= 1) return 0;
int reach = nums[0];
int temp = reach;
if(nums.length <= reach + 1) return 1;
int count = 2;
for (int i = 0; i < nums.length; i++) {
if(i == temp + 1) {
count++;
temp = reach;
}
if(i <= temp) {
reach = Math.max(reach, i + nums[i]);
if (reach >= nums.length - 1) return count;
}
}
return count;
}
}