给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
从第i个位置,最远可跳nums[i]步:
nums = [2, 3, 1, 1, 4, …];
从第i个位置,最远可跳至第index[i]个位置:
index[i] = i + nums[i];
index = [2, 4, 3, 4, 8, …]
若从第0位置最远可以跳至第i个位置;
则从第0位置也一定可以跳至:第1个位置、第2个位置、…、第i-1个位置。
从第0个位置,应该跳至第1、第2、…、第i-1、第i个位置中的哪个?
应该跳至第1、2、…、i-1、i位置中,又可向前跳至更最远位置(即index[1]、index[2]、…、index[i-1]、…、index[i]最大的那个) 的位置!(贪心)
思路:
1.求从第i位置最远可跳至第index[i]位置:根据从第i位置最远可跳nums[i]步: index[i] = nums[i] + i;
2.初始化:
1)设置变量jump代表当前所处的位置,初始化为0;
2)设置变量max_index代表从第0位置至第jump位置这个过程中,最远可到达的位置,初始化为index[0]。
3.利用jump扫描index数组,直到jump达到index数组尾部或jump超过max_index,扫描过程中,更新max_index。
4.若最终jump 为数组长度,则返回true,否则返回false。
class Solution {
public:
bool canJump(vector<int>& nums) {
vector<int> index; //标记第i个位置最远能到达哪个位置
for(int i = 0; i < nums.size(); i++) {
index.push_back(i + nums[i]);
}
int jump = 0;
int max_index = index[0];
while(jump < index.size() || jump <= max_index) {
//当前这个位置能到达更远的地方
if(index[jump] > max_index) {
max_index = index[jump];
}
jump++;
}
if(jump == index.size()) {
return true;
}
return false;
}
};
int main(void) {
vector<int> v;
/*
v.push_back(2);
v.push_back(3);
v.push_back(1);
v.push_back(1);
v.push_back(4);
*/
v.push_back(3);
v.push_back(2);
v.push_back(1);
v.push_back(0);
v.push_back(4);
Solution s;
bool res = s.canJump(v);
cout<<res;
return 0;
}