这道题其实是medium模式,不过因为他是Jump Game II的前提,所以也一并做了,思路倒是不复杂,就是从头到位遍历,一边遍历,一边“染色”,不过这题让我提交了七八次才通过oj,前几次是超时,后几次修改是有些条件没考虑,所以是很值得仔细琢磨的一道题,思路是这样的,从0开始,想象可以往后染色,然后在染色范围内,继续往后染色,如果某次染色的最大index大于等于最后的index即length-1,则返回true,如果一直循环到最后还没有发现这样的情况,就返回false,当然仅仅按照这个思路,未必能写出通过oj的程序,还必须进行一些剪枝去除不必要的循环,例如假如某次循环到第k个位置时,发现k已经不在被染色的位置范围内了,说明没有必要继续往下走了,直接break出循环即可。好了上代码:
public class Solution {
private void dye(int start, int end, Map<Integer, Boolean> dyeMap, int dyeEnd){
for(int i = Math.max(dyeEnd, start); i<=end; i++){
if(dyeMap.get(i)==null){
dyeMap.put(i, true);
}
}
}
public boolean canJump(int[] nums) {
int dyeEnd = 0;
Map<Integer, Boolean> dyeMap = new HashMap<>();
dye(0,0, dyeMap, dyeEnd);
for(int i = 0 ;i<=nums.length-1;i++){
if(dyeMap.size()>0){
if(dyeMap.get(i)==null){
break;
}
}
if(i+nums[i]>=nums.length-1){
return true;
}else{
dye(i, i+nums[i], dyeMap, dyeEnd);
dyeEnd = i+nums[i];
}
}
return false;
}
}