45. 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

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

说明:

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

思路:贪心法来做,时间复杂度O(n). 用变量aa来记录上一次能达到的最远位置,times记录所用的最小跳跃数,说明times步区能达到的最远位置是aa,比如在input{ 7, 0, 9, 6, 9, 6, 1, 7, 9, 0, 1, 2, 9, 0, 3},这个区间内,1步区所能达到的最远位置是7。在 i 到达aa(7)之前,所有的位置都可以通过times步数(1步)来达到,因此这个区间之内,每一个点当前可以达到的最远位置bb= max(bb, nums[i]+i),最小跳跃数为times+1(2步)。到了i=aa(即i==7)的时候,更新aa=max(bb, aa+nums[aa])=14, ++times, 也就是说标志着1步区的结束,2步区的开始,此时2步区所能达到的最远位置为aa=14。成为下一阶段3步区的前一个最优解。重复该过程。

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int aa = nums[0], times = 1, bb=aa;//1步最远可以到多远
        for (int i = 1; i < nums.size(); ++i){
            if (aa >= nums.size() - 1) return times;
            while (i < aa){
                bb = max(bb, nums[i] + i);
                ++i;
            }
            aa = max(bb,aa+nums[aa]);
            ++times;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/scarlett_guan/article/details/80159621