leetcode 45. 跳跃游戏 IIc++

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

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

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

示例:

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

说明:

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

本来想的是从后往前,计算最靠前的能一步到达尾部的下标,然后跳数加一,把最靠前的这个下标当做数组尾部元素,算递归吧。但是最差成了O(N2),后面想贪婪应该可以做,看似俩循环嵌套,但是实际只有O(n),思想就是在a[0]地方计算最远可以跳到a[i1](一步),在1到i闭区间计算区间内所有值最远可以跳多远a[i2](即两步跳多远)在i1+1到i2计算第三步。。。第四步知道最远跳到n-1;代码如下:

class Solution {
public:
    int jump(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size()==1) return 0;
        int k=nums[0]+0;
        int last_max=0;
        int max_ad=k;
        int max=max_ad;
        int step=1;
        while(max_ad<nums.size()-1){
            for(int i=last_max+1;i<=max_ad;i++){
                if(nums[i]+i>=max) max=nums[i]+i;
            }
            last_max=max_ad;
            max_ad=max;
            step++;
        }
        return step;
            
    }
};

猜你喜欢

转载自blog.csdn.net/HeXiQuan123/article/details/80895660
今日推荐