跳跃游戏
问题描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置
我的解法:
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function( nums ) {
let l = nums.length,
result = false ;
function jump( index, item){
if( index + item >= l-1 )
return true;
while( item > 0 ){
result = jump(index + (item), nums[ index + (item) ] );
if(result)
return result;
item--;
}
return result;
}
return jump(0,nums[0]);
};思路:
通过递归的方式,以每一步最大的跨度,找寻路径,然后逐次减一,继续找。
结果:
最后一个测试用例 因为超时又挂了。。。
go die
百度一番之后的解决方案:
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
let l = nums.length,
endPosition = l - 1;
for( let i = l-2 ; i >= 0 ; i-- ){
if( nums[i] + i >= endPosition ){
endPosition = i;
}
}
return endPosition == 0;
};思路分析:
假设从第一个我们可以跳到最后一个,那么反过来说,从最后一个向前追溯,也一定可以追溯到第一个。
只要我们有一个变量记录最终的位置,然后如果从右向左遍历时,如果有节点可以到达最后一个节点
那么就更新最后一个节点的位置为当前这个节点
然后
继续向前遍历
看偶没有节点的可以到达当前这个节点,
然后重复上述两个步骤,
最终看记录位置的那个变量能不能是第一个数组的元素,
如果是的话证明可以跳跃到最终位置
如果不是就证明无法跳跃到最终位置

浙公网安备 33010602011771号