版权声明:本文为博主原创文章,未经博主允许不得转载。 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]会发生越界的错误。