Leetcode之跳跃游戏Ⅱ

问题描述

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

问题解法

我们总是可以到达数组的最后一个位置但是要保证跳数最少。我们就要保证我们选的这一步可以跳的更远。假设在某个位置我们可以从i跳到i+a[i]这个位置,在这之间的任意位置我们都可以达到,那么最优的一定是(i,i+a[i]]之间最大的那个即max=max(j+a[j])i<j<=i+a[i]。再从这个位置继续向下跳,这个时候我们已经遍历过i+a[i]了(都没有当前这个位置大,我们再次遍历的时候就要从i+a[i]开始。因此我们需要将这个值记录下来。
除此之外就是特殊情况。当数组只有一个数时,只要能跳的步数合法可以到达(一定合法,题目要求)。

class Solution {
    public int jump(int[] nums) {
        if(nums.length==1&&nums[0]>=0)
            return 0;
        //num计数,max表示当前可以y跳到的最远距离,maxIndex标识t从maxIndex跳才能达到最远距离,index表示已经记录过的下标。x是上一次的最大下标因为随着max的更新for的条件判断会改变。
        int num=1,max=nums[0],maxIndex=0,x=0,index=0;
        while(true){
            if(max>=nums.length-1)
                return num;
            for(int i=index+1;i<=x+nums[x];i++){
                if(i+nums[i]>max){
                    max=i+nums[i];
                    maxIndex=i;
                }
            }
            index=nums[x]+x;
            x=maxIndex;
            num++;
        }
    }
}

运行结果

原文地址:https://www.cnblogs.com/code-fun/p/13789247.html