跳跃游戏
题目描述
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
题目链接:https://leetcode.cn/problems/jump-game/
文章讲解:https://programmercarl.com/0055.跳跃游戏.html
思考
贪心解法
示例 1:
- 输入: [2,3,1,1,4]
- 输出: true
- 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
从示例开始思考,
首先在位置0,这个位置上可以跳1步可以跳2步,我们的覆盖范围是位置2,如果我跳一步,我的覆盖范围就更新为位置4,如果跳两步,覆盖范围就是位置3。
我们会发现,跳两步反而距离短了,所以这时候我们不跳两步,或者说我们跳两步,但仍记录此时的最大覆盖范围。即一直保持最大的覆盖范围。
如果某次,覆盖范围到了终点,那么就认为可以到达最后一个位置。
思路就是:
每次移动都移动一步,此时更新最大覆盖范围。直到覆盖范围到达终点。
局部最优解:每次移动都选择最大的覆盖范围
代码实现
C++
bool canJump(vector<int>& nums){
int cover = 0;
for(int i = 0;i<=cover;i++){
cover = cover > (i + nums[i]) ? cover : (i + nums[i]);
if(cover >= nums.size()-1) return true;
}
return false;
}