55. Jump Game --leetcode

problem description

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.


For example:

A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

annalyse:

可以从贪心算法入手,可以从后往前贪心,从终点往起点尽可能选择长的步数,比如从题目第一个例子
分析,终点是4的位置,我们可以从4的前一位1开始贪心,1可以到达4的位置,1的前一位还是1,不能
到达4位置,1的前一位3,可以到达4的位置,3的前一位2,不能到达4位置,第一轮结束,选择最远的
3位置。然后使3变成了终点的位置,往前贪心,按照上面的步骤,直到到起点,如果不能到起点,那
就证明不能跳到终点,返回false。

接下来是代码问题:(看起来一切没问题。。。)

import java.util.*;

class Solution{

public boolean canJump(int[] nums) {

    int len = nums.length-1;
    if(len == 0)return true;
    int count = 0;
    int k = len-1;
    boolean flag = true;
    while(flag){
        count = 0;
        flag = false;
    for(int i = k;i>=0;i--){
        count++;
        if(nums[i] >= count){
          k = i;  
          flag = true;
        } 
    }
    if(k == 0 && flag)return true;
    k--;
    }
        return false;
    }

public static void main(String []args){

    Solution s = new Solution();
    int []a = {2,3,1,1,4};
    int []b = {0,2,3};
    int []c = {2,3,0,0};
    System.out.println(s.canJump(a));
}

}

then 提交
。。。。。。。
超时。。。。。

苦思冥想,无奈智商不够用,求助ACM同学
人家给的是尺取法,经过很久时间的苦思冥想,查了许多关于尺取法的资料后,终于想明白了
对终点之前的每一个元素进行判断,是否能够到达前一个有效元素,什么叫有效元素?? 举个
栗子,判断int []a = {2,3,0,1,4} 可以先从倒数第二个开始判断,能否到达最后终点,如
果可以那它就是有效元素,然后,判断有效元素的前面一个元素能否到达有效元素的位置,如果
不能(上面的0不能到达1的位置),那就继续判断前面一个元素(3),同时距离要更新(距离
有效元素),直到判断到起点,结束。
代码:

import java.util.*;

class Solution{

public boolean canJump(int[] nums) {

    int len = nums.length-1;
    for(int i = len-1;i>=0;i--){
        if(i+nums[i] >= len){//判断能否到达有效位置
            len = i;  //更新距离
            if(i == 0)return true;//证明起点位置能够到达终点
        }
    }
        return false;
    }

public static void main(String []args){

    Solution s = new Solution();
    int []a = {2,3,1,1,4};
    int []b = {0,2,3};
    int []c = {2,3,0,0};
    System.out.println(s.canJump(b));
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值