问题描述:https://leetcode.com/problems/jump-game-ii/
分析:这道题最开始使用DP算法,发现TLE,然后归纳代码发现,没有必要分配额外的空间,而只需要保留一个空间的左边界和右边界即可。当这个右边界小于target时,从左边界遍历到右边界,查看这一轮里面右边界最多延伸到什么地方?当然,如果新的右边界小于等于原来的右边界,那么jump game就困死在了这一轮,反之,就开始下一轮,开始部分由end+1开始。
这种思想有些像BFS,不是嘛
代码如下:9ms
public class Solution {
public int jump(int[] nums) {
int level = 0;
int start = 0,end = 0;
int target = nums.length - 1;
while(end<target){
level++;
int value = start;
for(int i = start;i<=end;i++){
value = Math.max(value,nums[i]+i);
}
if(value<=end)//never has chance to reach last
return -1;
start = end+1;
end = value;
}
return level;
}
}