这题仍然是考察算法和思路的,有思路了实现并不难。
class Solution {
public:
/*
若∃ index < nums.size()-1, 使index+nums[index] >= nums.size()-1,意味着只要能到达第index个元素,就可以通过这个元素到达第
nums.size()-1个元素,此时,我们只需考虑能否从前面的元素到达第index个元素。据此逆序迭代,找到最小的出发点,判断下标是否为0即可。
*/
bool canJump(vector<int>& nums) {
int min_index = nums.size()-1;
for(int i = nums.size()-2; i >= 0; --i)
{
if(i+nums[i] >= min_index)
{
min_index = i;
}
}
return min_index==0;
}
};
若想能到达第i个元素,则必须∃ index < i, 使index+nums[index] >= i;当存在这样的index后,当且仅当能到达第index个元素,才能到达第i个元素(若能到达第index个元素之后的元素,则必能到达第index元素;反之,若连第index个元素都不能到达,则其后的元素更到达不了,所以此时只需考虑第index个元素),我们再将第index个元素设为目标,再在其之前的元素里查找是否有能够到达第index个元素的元素,而不关心初始目标--第i个元素了。