大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是数组的遍历和贪心算法。
题目解答方法的文字分析
题目给出了一个非负整数数组 nums,表示处在第 i 个障碍时可以的最大跳跃长度。牧人领着牛群首先站在第一个障碍位置,我们需要判断牧人是否能够带领牛群跨越所有障碍,并到达最后一个障碍的位置。
我们可以使用贪心算法来解决这个问题。贪心算法的思想是每次都选择局部最优解,从而达到全局最优解。在这个问题中,我们可以贪心地选择跳跃的步数,每次选择能够跳跃最远的步数。
具体做法如下:
- 初始化一个变量 maxReach 表示当前能够跳跃的最远距离,初始值为 0。
- 遍历数组 nums,对于每个位置 i,判断当前位置是否能够到达,即判断 i 是否小于等于 maxReach。
- 如果当前位置 i 能够到达,则更新 maxReach 为 max(maxReach, i + nums[i]),表示当前位置能够跳跃的最远距离。
- 继续遍历数组,直到遍历完所有位置。
- 如果在遍历过程中,maxReach 大于等于数组的最后一个位置(即 nums.size() - 1),说明牧人能够带领牛群跨越所有障碍并到达最后一个障碍的位置,返回 true;否则,返回 false。
本题解析所用的编程语言
C++
完整且正确的编程代码
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return bool布尔型 */ bool can_jump(vector<int>& nums) { int n = nums.size(); int maxReach = 0; // 当前能够跳跃的最远距离 for (int i = 0; i < n; ++i) { if (i <= maxReach) { // 当前位置能够到达,更新能够跳跃的最远距离 maxReach = max(maxReach, i + nums[i]); if (maxReach >= n - 1) { // 如果能够跳跃的最远距离大于等于数组的最后一个位置,返回 true return true; } } } return false; } };