public class JumpGames {

    //方法一:暴力,遇到0的时候就去判断一下前面的数是否可以跳过这个0,如果最后一个数是0,判断是否可以刚好到达或者跳跃该数
    public boolean canJump1(int[] nums) {
        if(nums[0]==0&&nums.length!=1) return false;
        for (int i = 1; i <nums.length ; i++) {
            if(nums[i]==0){
                //写一个方法判断这个0是否可以跳跃过去
                boolean fl = flag(nums,i);
                if(fl){
                    continue;
                }else {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean flag(int[] nums,int m){
        for (int i = 0; i <m; i++) {
            if(i+nums[i]>m){
                return true;
            }else if(m==nums.length-1&&i+nums[i]>=m){
                return true;
            }
        }
        return false;
    }

    //方法二:贪心策略
    public boolean canJump(int[] nums) {
        //定义一个变量,保存当前最远能跳到的位置
        int farthest = 0;
        //遍历数组,更新farthest
        for (int i = 0; i <nums.length ; i++) {
            //判断当前i在可到达的范围内,更新farthest
            if(i<=farthest){
                farthest = Math.max(farthest,i+nums[i]);
                if(farthest>=nums.length-1){
                    return true;
                }
            } else{
                //如果i已经到不了
                return false;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[] nums = {3,2,1,0,4};
        JumpGames jumpGames = new JumpGames();
        System.out.println(jumpGames.canJump(nums));
    }
}