断更多天,懒狗ex
题型:数组、模拟、类似双指针?
链接:55. 跳跃游戏 - 力扣(LeetCode)
来源:LeetCode
题目描述
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
题目样例
示例 1:
输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
1 <= nums.length <= 104
0 <= nums[i] <= 105
题目思路
虽然过去好多天,但还是记得这道题看的是评论区而不是题解 题解好像是dp还是什么的
闲话少说,(评论区)里面的思路很朴实直接,感觉没有 dp 那么有通用型:从数组的末尾往前遍历,遍历的时候看看【能不能到target】(笔者姑且称 需要到达的点 为target),然后就 if 分支:①如果能到的话,就更新 target 为 i,然后 i 就前移。 ②如果到不了的话,i 继续往前走——因为你也不能保证前面有没有更好的嘛(哲学起来了是嘛?)。当然走到尽头都没有,那就return 0吧(认清现实了属于是)
这样一看,这个思路真有些【双指针】的味道,而且这种不断考虑的操作,和 dp 又很想
C++代码
class Solution {
public:
bool canJump(vector<int>& nums) {
// 看评论区:从后面开始遍历
// return的是bool,所以只判断对错即可
int i,len=nums.size();
int target = 1;
if(len <= 1)
return 1;
for(i=len-2;i>0;i--)
{
if(nums[i] >= target)
target = 1;
else
target ++;
}
if(nums[0] >=target)
return 1;
return 0;
}
};