跳跃游戏

跳跃游戏

题干

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

解法

1.初始想法:从末位开始,逐位传递

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length<=1){
            return true;
        }
        int [] whether=new int[nums.length];
        whether[nums.length-1]=1;
        for(int i=nums.length-2;i>=0;i--){
            if(have1(whether,nums[i],i)){
                whether[i]=1;
            }
            else{
                whether[i]=0;
            }
        }
        if(whether[0]==0){
            return false;
        }
        else{
            return true;
        }
    }
    boolean have1(int[]whether,int step,int cur){
        if(step==0){
            return false;
        }
        for(int i=1;i<=step;i++){
            if(whether[i+cur]==1){
                return true;
            }
        }
        return false;
    }
}

2.贪心算法:从头到尾遍历,如果最大的能到达的位置大于或等于最后数组的最后一个位置,即返回true,否则返回false

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length<=1){
            return true;
        }
        int maxPosition=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]+i>maxPosition&&maxPosition>=i){//可以进一步优化
            //当i>maxPosition的时候,后面的step都毫无意义,因为根本无法到达,直接return false即可。
                maxPosition=nums[i]+i;
            }
        }
        if(maxPosition>=nums.length-1){
            return true;
        }else{
            return false;
        }
    }
}
posted @ 2023-09-21 17:03  5hithin  阅读(12)  评论(0)    收藏  举报