public class JumpGames2 {
    //方法一:反向跳跃
    public int jump1(int[] nums) {
        //定义一个变量保存跳跃步数
        int steps = 0;

        //定义循环变量
        int currPosition = nums.length-1;

        //不停的向前跳跃,以最远的距离
        while (currPosition>0){
            //从前到后遍历数组元素,找到当前距离最远的“上一步位置”
            for (int i = 0; i <currPosition ; i++) {
                if(i+nums[i]>=currPosition){{
                    currPosition = i;//从前到后,第一次能跳到当前位置的位置,就是最远的上一步位置
                    steps++;
                    break;
                }}
            }
        }
        return steps;
    }


    //方法二:正向跳跃,考虑能够跳到最远的两步
    public int jump2(int[] nums) {
        //处理特殊场景
        if(nums.length==1) return 0;
        //定义一个变量保存跳跃步数
        int steps = 0;
        int currPosition = 0;

        //定义双指针,指向当前位置跳一步和两步分别能到的最远位置
        int farthest = nums[0];
        int nextFarthest = farthest;

        //不停贪心寻找下一步的合适位置
        while (farthest<nums.length-1){
            //遍历currPosition-farthest范围所有元素,选择第二步跳跃最远的作为当前一步的选择
            for (int i = 0; i <=farthest; i++) {
                //如果比之前第二部最远距离大,就更新
                if(i+nums[i]>nextFarthest){
                    nextFarthest = i+nums[i];
                    currPosition = i;
                }
            }
            //当前一步完成
            steps++;
            farthest = nextFarthest;
        }
        return ++steps;

    }


    //方法三:正向跳跃,优化
    public int jump(int[] nums) {
        //处理特殊场景
        if(nums.length==1) return 0;
        //定义一个变量保存跳跃步数
        int steps = 0;

        //定义双指针,指向当前位置跳一步和两步分别能到的最远位置
        int farthest = nums[0];
        int nextFarthest = farthest;

        //遍历currPosition-farthest范围所有元素,选择第二步跳跃最远的作为当前一步的选择
        for (int i = 0; i <nums.length-1; i++) {
            //如果比之前第二部最远距离大,就更新
            if(i+nums[i]>nextFarthest){
                nextFarthest = i+nums[i];
            }
            //添加步数增长条件,处理到farthest
            if(i==farthest){
                steps++;
                farthest = nextFarthest;
            }
        }
        return ++steps;
    }

    public static void main(String[] args) {
        int[] nums = {1,1,2,1,1};
        JumpGames2 jumpGames2 = new JumpGames2();
        System.out.println(jumpGames2.jump(nums));
    }
}