#include <iostream>
#include <vector>
using namespace std;
bool canJumpToEnd(vector<int> jumpVec)
{
//1.先初始化一个等长数组,用于存放每个位置最远能到达的距离
vector<int> jumpToMaxDesVec;
for (int i = 0; i < (int)jumpVec.size(); i++)
{
jumpToMaxDesVec.push_back(i + jumpVec[i]);//i + jumpVec[i]表示jumpToMaxDesVec[i]的第i个元素最远能到达的距离
}
//2.挨个遍历jumpVec并不断更新当前位置能到达的最远值
//循环结束条件:1.遍历完了jumpVec的每一个元素 || 2.当前遍历元素超过了目前最远值能到达的位置
//eg:3 2 1 0 4 5 6 7 8
//挨个遍历,当遍历 3 的时候,最远能到0;
//挨个遍历,当遍历 2 的时候,最远仍然是能到0;
//挨个遍历,当遍历 1 的时候,最远仍然是能到0;
//挨个遍历,当遍历 0 的时候,最远仍然是能到0;
//挨个遍历,当遍历 4 的时候,最远是能到8;
//但是此时不应该去遍历4,因为前面的元素到达不了4的位置;
//所以有条件:当当前遍历元素超过了目前最远值能到达的位置,即当前遍历元素4超过了当前能到达的最远的位置0元素的地方
//直接退出循环,判断是否遍历了所有元素
int curentIndex = 0;
int maxDes = jumpToMaxDesVec[0];
while (curentIndex < (int)jumpVec.size() && curentIndex <= maxDes)
{
if (jumpToMaxDesVec[curentIndex] > maxDes)
{
maxDes = jumpToMaxDesVec[curentIndex];
}
curentIndex++;
}
//判断是否遍历了所有元素,如过所有元素都被遍历了,即curentIndex的值大于了最后一个元素的下标,
//当上面的逻辑遍历最后一个元素的时候,curentIndex会++,curentIndex的值就大于了最后一个元素的下标
if (curentIndex > (int)jumpVec.size() - 1)
{
return true;
}
return false;
}
int main()
{
vector<int> jumpVec1 = { 2, 4, 2, 1, 0, 2, 0 };
cout << canJumpToEnd(jumpVec1) << endl;
vector<int> jumpVec2 = { 2, 4, 2, 3, 1, 0, 0 };
cout << canJumpToEnd(jumpVec2) << endl;
vector<int> jumpVec3 = { 3, 2, 1, 0, 4};
cout << canJumpToEnd(jumpVec3) << endl;
}