OJ - 55 Jump Game

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nia305/article/details/80249976

题目:给定一个都是正整数的数组,判断是否能到达数组的最后一个数。每一个元素代表了你最多能跳跃的步数。
例子

得到这个题目之后,我们可以想到:

用[3,2,1,0,4]这个数组为例,index=0,nums[index] = 3,则我们最多只能跳到index为index+nums[index] = 3 + 0 = 3的地方,从index到index+nums[index]之间没有让我们能跳得更远的index【如果我们把2改成3的话,那么我们最远就可以跳到index+nums[index] = 3+1 = 4的地方,则可以到达终点】,而且index=3的地方的元素为0,意思是无法再移动,并且没有到达数组的最后一个元素,所以就需要返回false。
上面就是解题思路,其实很好理解,大致是贪心算法,依次寻找能让我们更接近目的地的地方,如果有能让我们到达更接近目的地的地方,我们就从那个地方继续开始探索。

下面是代码:

bool canJump(vector<int>& nums) {
        int size = nums.size();
        if (size == 1) {
            return true;
        }
        int i = 0;
        while (i < size) {
loop:
            int k = i;
            int currentMax = -1;
            for (; k < nums[i]+i+1; ++k) {
                if (nums[k] > nums[i]) {
                    i = k;
                    goto loop;
                }
                if (k + nums[k] >= currentMax) {
                    currentMax = k + nums[k];
                }
                if (currentMax >= size-1) {
                    return true;
                }
            }
            if (nums[currentMax] == 0) {
                return false;
            } else {
                i = currentMax;
            }
        }
    }

上面有几点需要说明:

① goto loop:我们找到了比当前开始探索的第一个数更大的数【能让我们更接近目的地】,所以我们就需要让i=k【从这个点开始重新探索】,然后跳到这个循环的开始【继续探索】。
② currentMax >= size-1 为什么要放在循环里面判断:因为如果已经可以到达数组的最后一个数了,并且size-1 + nums[size-1] >= currentMax 但是循环还在继续,那么currentMax会变成size-1 + nums[size-1]会发生越界的错误。

猜你喜欢

转载自blog.csdn.net/nia305/article/details/80249976