解题思路
- 使用数组中指定的移动距离 判断 元素能否移动到数组末尾,即判断当前可移动的最大值能否超过数组长度
- 设置maxRange用于记录当前能够移动的最大距离,当maxRange>nums.length时,则可以返回true
- for循环:使用变量i,通过移动变量i,来更新maxRange的值【maxRange = Math.max(maxRange, i+nums[i])】
- 为何要设置【i<=maxRange】?由于maxRange是当前遍历的最长数组,所以当使用变量i进行遍历时,需要控制其遍历的范围不超过当前可移动的最大范围。
Java代码实现
class Solution {
public boolean canJump(int[] nums) {
if(nums.length == 1){
return true;
}
// 使用maxRange控制可移动的最远位置
int maxRange = 0;
for(int i=0; i<=maxRange ; i++){
maxRange = Math.max(maxRange, i+nums[i]);
if(maxRange > nums.length){
return true;
}
}
return false;
}
}
解题思路
- 题目要求:使用数组中指定的移动距离 返回 移动到数组末尾 的最小可移动次数,即返回移动的最小次数【设置变量result】
- 设置end用于记录当前能够移动的最大距离,设置变量temp用于记录下一步能够移动的最大距离;遍历到 i=end 时,说明已遍历到当前能够移动的最大距离,更新end值,同时result++,说明移动次数需要增加1;
- for循环:使用变量i,通过移动变量i,来更新 temp 和 end 的值【temp = Math.max(temp, i+nums[i])】
- 为何要设置【i<=end && end<nums.length-1】?由于 end 是当前遍历的最长数组,所以当使用变量 i 进行遍历时,需要控制其遍历的范围不超过当前可移动的最大范围。同时,当 end 已经遍历到数组末尾了,说明已经到达终点了。
Java代码实现
class Solution {
public int jump(int[] nums) {
// 使用res记录需要几步,end表示当前能够覆盖的最大范围,temp下一步覆盖的最远范围
int result = 0;
int end = 0;
int temp = 0;
for(int i=0; i<=end && end<nums.length-1; i++){
// 更新temp,用于记录下一步能够覆盖的最大范围
temp = Math.max(temp, i+nums[i]);
// 当i递增到end时,说明,当前的最大值未更新,则更新end,并且将res值+1
if(i == end){
end = temp;
result++;
}
}
return result;
}
}