|
| 1 | +class Solution { |
| 2 | +public: |
| 3 | + // 分析题意 |
| 4 | + // 首先读懂题意,每个位置都可以跳跃,题目没有说明只能向右跳,所以向左跳和向右跳都是可以的。但向左跳会增加我们搜索的复杂度 |
| 5 | + // 思考向左跳有意义吗?向左跳没有意义,可以剪枝 |
| 6 | + // 反证法,加入向左跳一次才能到达终点。那么在当前状态A向左跳一次到B,也是相当于在到达当前状态之前的所有状态直接跳到B |
| 7 | + // 主要是因为起点是0,既然能调到更远的位置A,那么也能调到更近的位置B |
| 8 | + |
| 9 | +// method 1, 因而可以用递归方法,每次向右跳, 但会超出时间限制错误 |
| 10 | +// bool canRightJump(vector<int>& nums, int now){ |
| 11 | +// // 处理特殊case, 已经到达终点,返回真 |
| 12 | +// if (nums.size() - now == 1)return true; |
| 13 | +// // 至少跳一步 |
| 14 | +// for (int i = 1; i <= nums[now]; ++i){ |
| 15 | +// // 不能超出界限 |
| 16 | +// if (now + i >= nums.size())continue; |
| 17 | +// // 处理一般情况 |
| 18 | +// if (canRightJump(nums, now + i))return true; |
| 19 | +// } |
| 20 | +// return false; |
| 21 | +// } |
| 22 | + |
| 23 | +// bool canJump(vector<int>& nums) { |
| 24 | +// // 处理异常case |
| 25 | +// assert(nums.size() >= 1); |
| 26 | +// // 调用递归函数,初始位置为0 |
| 27 | +// if (canRightJump(nums, 0))return true; |
| 28 | +// else return false; |
| 29 | +// } |
| 30 | + // method 2, 利用推理将问题做一个简化,等价转化为另一个小问题,问题可以转化为是否能跳过所有的值为0的元素 |
| 31 | + // 根据题意,所有元素都是非负整数,两种可能,正整数和0。 |
| 32 | + // 如果所有元素都是正整数,那么显然可以跳到终点 |
| 33 | + // 如果出现为0的元素,那么只要能跳过这个0就可以,采用for循环来遍历所有位置,采用while循环了来判断是否能跳过0 |
| 34 | + bool canJump(vector<int>& nums){ |
| 35 | + // 处理异常 |
| 36 | + assert(nums.size() >= 1); |
| 37 | + // NOTE 1, 39和41行代码的顺序不能调换 |
| 38 | + // 起点即终点,返回真 |
| 39 | + if (nums.size() == 1)return true; |
| 40 | + // 处理特殊情况,第一个位置为0,则永远跳不到终点 |
| 41 | + if (nums[0] == 0)return false; |
| 42 | + // 注意,终点不用判断是否能跳过去,只判断是否能跳过终点前一站就好了 |
| 43 | + for (int i = 1; i < nums.size() - 1; ++i){ |
| 44 | + // 非0则继续查找0元素 |
| 45 | + if (nums[i] != 0)continue; |
| 46 | + // 如果是0元素,则往回找看那个位置开始起跳,可以跳过这个0 |
| 47 | + int j = i - 1; |
| 48 | + while (j >= 0){ |
| 49 | + // <则表示能跳过 |
| 50 | + if (i - j < nums[j])break; |
| 51 | + j--; |
| 52 | + } |
| 53 | + if (i != 0 && j == -1)return false; |
| 54 | + } |
| 55 | + // 如果遍历结束表示跳到了终点,返回真 |
| 56 | + return true; |
| 57 | + } |
| 58 | +}; |
0 commit comments