LeetCode T45.Jump Game Ⅱ/跳跃游戏Ⅱ

 

 本题的要求是返回跳跃的最小步数,在跳跃中能够跳的最大位置为数组中该位置所对应的元素的值,即在上面例子中nums[0]能够跳跃的最大步数为两步即从nums[0]可以跳跃到nums[1]或nums[2]。

这里显然我们需要尽可能地选择跳跃步数最大的跳跃方式,跳跃之后记录该跳跃的位置,在当前位置 i 和上一次跳跃的最大位置 end 之间寻找下一步最大的跳跃值(记录maxPosition),这样做是符合贪心算法以每一小步的最有最终得到全局最优。而从数组的首端开始道最终结束,我们仅仅只循环了一次,因此其时间复杂度为O(n),变量为常数个,空间复杂度为O(1)。

我的代码如下,leetcode上运行时间8ms,内存占用6.7MB

int jump(int* nums, int numsSize){
    int steps=0,end=0,maxPosition=0;
    for(int i=0;i<numsSize-1;i++){
        maxPosition=maxPosition>(i+nums[i])?maxPosition:(i+nums[i]);
        if(i==end){//记录上一步的最远位置,i到end之间便是上面maxPositioin试跳跃择优的过程
            end=maxPosition;
            steps+=1;
        }
    }
    return steps;
}

 

posted @ 2020-05-04 08:15  runsdeep  阅读(155)  评论(0编辑  收藏  举报