1 class Solution {
2 public:
3 bool canJump(vector<int>& nums) {
4 int max_len = 0;
5 for(int i = 0; i < nums.size()-1;i++) {
6 max_len = max(max_len,i+nums[i]);
7 if (max_len <= i) return false;
8 }
9 return max_len>=nums.size()-1;
10 }
11 };
1 class Solution {
2 public:
3 //The main idea is based on greedy. Let's say the range of the current jump is [curBegin, curEnd], curFarthest is the farthest point that all points in [curBegin, curEnd] can reach. Once the current point reaches curEnd, then trigger another jump, and set the new curEnd with curFarthest, then keep the above steps, as the following:
4
5 int jump(vector<int>& nums)
6 {
7 int max_far = 0;// 目前能跳到的最远位置
8 int step = 0; // 跳跃次数
9 int end = 0; // 上次跳跃可达范围右边界(下次的最右起跳点)
10 for (int i = 0; i < nums.size() - 1; i++)
11 {
12 max_far = std::max(max_far, i + nums[i]);
13 // 到达上次跳跃能到达的右边界了
14 if (i == end)
15 {
16 end = max_far; // 目前能跳到的最远位置变成了下次起跳位置的有边界
17 step++; // 进入下一次跳跃
18 }
19 }
20 return step;
21 }
22 };