一、
思路:
这个题中等难度,只是问能不能调到最后的位置
需要维护的是当前能够跳的最远的地方
class Solution {
public boolean canJump(int[] nums) {
int max_index=0;
int length=nums.length-1;
for(int i=0;i<nums.length;i++){
if(i>max_index||max_index>=length)
break;
max_index=Math.max(max_index,i+nums[i]);
}
return max_index>=length;
}
}
二、
题目描述和分析:
这个hard难度,问的是最小步数(也就是问的跳到最后的最小步数,可以假设始终可以到达最后的位置)
分析:
其实这个问题不是很好理解,对于我来说是这样的。
要说第一个跳跃问题,只是判断能不能跳到最后,那我只用知道每一个位置能最远跳到哪里,和我当前最大max_index比较一下就可以了。
现在这个第二个问题,默认都能够跳到最后,但是问怎么样步数最小。
这个是看别人的实现,刚开始看着不是很容易理解
// Time Complexity: O(n). Space: O(1).
public int jump(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
// cur是维护的当前能跳到的最大位置
// 第step+1步,能到达的最远距离
int cur = 0;
// last是指从之前的点能reach到得最远位置
// 已经可以到达的最大距离
int last = 0;
int step = 0;
for (int i = 0; i < nums.length/* && i <= cur */; i++) {
// 当i 大于之前点能碰到的最大位置时,就需要跳一步,
// 并把last更新为cur.
if (i > last) {
step++;
last = cur;
}
// 计算step+1的最大距离
cur = Math.max(cur, nums[i] + i);
}
// 最后返回若是cur能到最后一个元素,就返回step,
// 若是到不了,就说明根本走不到最后一步,返回-1.
return cur < nums.length - 1 ? -1 : step;
}
但是我做了一点改进,让看着更明白
class Solution {
public int jump(int[] nums) {
int length=nums.length;
if(nums==null||length==0)
return -1;
int cur_maxIndex=0;
int last_maxIndex=0;
int min_jump=0;
for(int i=0;i<length;i++){
if(last_maxIndex>=length-1)
break;
if(i>last_maxIndex){
min_jump++;
last_maxIndex=cur_maxIndex;
}
cur_maxIndex=Math.max(cur_maxIndex,nums[i]+i);
}
return min_jump;
}
}
改进之后,原先是6ms,现在是5ms了。然后我们来分析一下这个时候,就比较好理解了,就是说last_maxIndex其实是上一步能够到达的最远距离,cur_maxIndex是当前能够到达的最远距离