跳跃游戏
问题描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置
我的解法:
/** * @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; };
思路分析:
假设从第一个我们可以跳到最后一个,那么反过来说,从最后一个向前追溯,也一定可以追溯到第一个。
只要我们有一个变量记录最终的位置,然后如果从右向左遍历时,如果有节点可以到达最后一个节点
那么就更新最后一个节点的位置为当前这个节点
然后
继续向前遍历
看偶没有节点的可以到达当前这个节点,
然后重复上述两个步骤,
最终看记录位置的那个变量能不能是第一个数组的元素,
如果是的话证明可以跳跃到最终位置
如果不是就证明无法跳跃到最终位置