LeetCode经典面试150题-day7(跳跃游戏)

每日箴言:

一周下来了,碰到算法题没那么无助了,不过按顺序刷题,目前都是一个类型的问题,前路漫漫,奋力前行吧 !!!

 LeetCode经典面试150题-day7(跳跃游戏)_第1张图片

1、题目

LeetCode经典面试150题-day7(跳跃游戏)_第2张图片

2、分析

LeetCode上有一张图特别好,借用一下,懒得自己画了

LeetCode经典面试150题-day7(跳跃游戏)_第3张图片

⑴ 、这张图阐述了一个道理,每个位置有几种跳跃方案,最远的移动位置到哪,就这两点我们来往下说

⑵ 、我们求的是当前位置是否能达到最后一个下标位置,我们当前位置是i ,我们可以移动的最大距离是nums[i] , 我们可以移动到的最大下标位置是 i + nums[i]

⑶ 、综上,只要最大下标maxReach超过nums.length - 1,当前i的位置就可以达到最后一个下标位置

⑷ 、首先我们遍历数组,我们需要定义一个最大下标maxReach,每次都用Math.max方法来求当前位置的最大下标位置,比较maxReach 和 i + nums[i]的大小,谁大更新谁,代表当前i的位置可以跑到的最远位置,最后判断最远下标是否大于等于size - 1,也就是数组的最大下标

3、解题

    /**
     * 跳跃游戏
     * 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
     * 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
     *
     * @param nums
     * @return
     */
    public static boolean canJump(int[] nums) {
        int size = nums.length;
        //最远距离
        int maxReach = 0;
        //当前位置能达到的最大下标位置 i + nums[i]
        for (int i = 0; i < size; i++) {
            if (i > maxReach) {
                return false;
            }
            maxReach = Math.max(maxReach, i + nums[i]);
            //如果当前位置的maxReach可以大于等于size - 1 ,就代表当前元素可以达到最后一个下标
            if (maxReach >= size - 1) {
                return true;
            }
        }
        return false;
    }

你可能感兴趣的:(leetcode,面试,游戏)