LEETCODE 55. Jump Game
贪心算法
题目要求
给出一个非负整数数组,每个元素代表在当前位置能往前跳的最大步数,判断能否跳到这个数组的最后。
用一个例子理解:
A = [2,3,1,1,4], return true.
元素 | 2 | 3 | 1 | 1 | 4 |
---|---|---|---|---|---|
index | 0 | 1 | 2 | 3 | 4 |
就是说在index=0的时候,最大步数是2,index可以+0,+1,+2;数组要跳到数组的最后只需要保证有一种跳转方案的步数和是大于等于数组长度。如果没有一种方案满足这个最低要求则无法跳到数组最后。
解题思路
每次迭代根据当前迭代的左界和右界,计算得到下一次迭代的右界,下一次的左界就是当前迭代的右界,只要计算得到右界是大于数组长度的就可以停止迭代,这时说明已经找到可以跳到数组最后的方案了,返回true;或者下一次迭代的右界并没有在当前迭代右界的右边,说明这时已经跳到了可以到达的最远处,而且小于数组长度,说明无法跳到数组最后,返回fase。
代码
class Solution {
public:
bool canJump(vector<int>& nums) {
int endInd = int(nums.size()), leftInd = 0, rightInd = 1;
while (rightInd < endInd) {
int newRightInd = rightInd;
for (int i = leftInd; i < rightInd; i++) {
//cout << i << endl;
if (i + nums[i] >= newRightInd) {
newRightInd = i + nums[i] + 1;
}
}
if (newRightInd <= rightInd) {
break;
}
leftInd = rightInd;
rightInd = newRightInd;
//cout << leftInd << " " << newRightInd << endl;
}
return rightInd >= endInd;
}
};