leetcoed刷题日记之第六题(跳跃游戏)(贪心算法)

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++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值