1.题目如下:
注意好好读题!!!
这里的第一个下标是数组的num[0],其中每个元素代表你在该位置可以跳跃的最大长度,注意是最大,而不是必须跳这么多。
我一开始认为的第一个下标是num[1],每个元素代表你在该位置可以跳跃的长度,结果写的代码局限性很大,错解,如下:
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
for ( var i = 1 ; i < nums.length ; i++){
if (nums.length<2||nums.length==2){
return false;
}
else if ( nums.indexOf(nums[i+nums[i]]) == nums.length -1){
return true ;
break;
}
else if ( nums[i+nums[i]] == 0 ){
return false ;
break;
}
}
};
这个代码下:假如nums给的结果是[0],就运行不下去了,返回值一直是undefined
正确思路如下:
对于每一个存放在数组中的位置index,判断是否可达,即首先要判断能否从第一个位置到达第二个位置,如果不能直接返回false
如果可以达到,计算它的最大跳跃长度x=i+num【i】(也就是当前从i能到达的最远位置),然后判断x是否>=数组的最后一位元素索引y=num.length -1 ,是 返回true ,不是进入下一轮循环。
当循环结束后如果没有false值返回,那么说明最后一个位置可达,返回true
图解如下:
具体代码如下:
var canJump = function(nums) {
var mx= 0;
var y =nums.length -1;
for ( var i = 0 ; i < nums.length ; i++){
if (i > mx) { // 无法到达 i
return false;//如果循环结束没有返回false,说明是可以达到的,结尾处返回true
}
mx = Math.max(mx, i + nums[i]); //因为上一步判断,已经判断了是否能到达i
//这里就实时更新最远可以到达的位置
if (mx >= y){//如果最远可以到达的位置>=数组长度
//即满足结果可以提前跳出循环,不用全部遍历完
return true;
}
}
return true;
}
这个代码里,如果不加
if (mx >= y){//如果最远可以到达的位置>=数组长度
//即满足结果可以提前跳出循环,不用全部遍历完
return true;
}
也可以返回正确结果,而且时间效率更高,因为不需要进行判断,加这个判断条件是为了早一点结束循环,如果想要追求更高的时间效率,可以把这个判断语句转化成循环条件
for ( var i = 0 ; mx < nums.length -1 ; i++)