此题与leetcode跳跃游戏2为同一题,在此给出leetcode的链接。
leetcode题目链接

这题要 求的是 最少次数。
我们贪心的去思考,只要我们每次跳的尽可能远,就能保证跳跃次数尽可能少。
那是不是我们直接每次都跳最远的距离,就行了吗?
很明显不是。
因为如果存在如下情况 4 10 1 1 1 1 1 1 1
我们直接跳到10,就可以到达结束点了,但是每次跳最远,反而会更慢。

这是因为在第一个点可到达的范围内,存在某点x,它比这块范围内的其他点能到达的区域都更远。
这个点才是我们该跳到的点。

如果我们不选择x,而选择它前面或者后面的点 others。
那么对于它能到达的最远点j, others要达到这个点至少需要2次以上的跳跃了。(当然还可以到不了)

这里想完了之后再去想想何时更新这个最远距离。
答案是 第一个点的最远点,因为这样才能保证我们每次都正确地选取了 x。

依照上述思路,注意一下边界情况,就能写出代码了。

#include 
int main() {
    //读数
    int n;
    scanf("%d", &n);
    int nums[n];
    for(int i = 0; i < n; ++i) {
        scanf("%d", &nums[i]);
    }
    // 边界判断
    if(n == 0) {
        printf("-1");
        return 0;
    }
    if(n == 1) {
        printf("0");
        return 0;
    }
    //  核心逻辑
    int maxLength = nums[0], currentLength = nums[0], c = 0;
    for(int i = 0; i < n; ++i) {
        if(nums[i] + i > maxLength) {
            maxLength = n-1 < nums[i] + i ? n-1 : nums[i] + i;
        }
        if(i == currentLength) {
            currentLength = maxLength;
            ++c;
        }
    }
    //输出
    if(currentLength >= n-1) {
        printf("%d", c);
    }  else {
        printf("-1");
    }
    return 0;
}