Jump Game (Medium)
2015-11-09 20:45
309 查看
主要有两种思路:
一、
本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置i后,在直接在这个位置的基础上走nums[i]步,主要保证能一直前进,就能达到终点;
那么,什么时候才不能一直前进呢?
答案是,遇到0的时候,遇到nums[i]=0的时候,只要我们想办法跳过这个0,那么就可以确保我们可以继续前进。
所以遇到0时的处理方法是,往回搜索,设当前的位置为pos,即nums[pos]=0,一直搜索之前的数,判断nums[i]+i是否大于nums[pos],大于则可以继续上述的贪心算法,假如一直跳不过0(即搜索到i=0仍跳不过pos),则return false。
代码如下:
二、
记录两个变量,一个是当前能达到的最远距离,另外一个是下一次能达到的最远距离。
O(n)的时间复杂度和O(1)的空间复杂度。
在到达当前最远距离前(包括当前最远距离),不断更新下一次能达到的最远距离。当到达了当前最远距离,除了更新nextMaxPos,还需要把currentMaxPos=nextMaxPos,nextMaxPos=0
下面为AC代码:
一、
本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置i后,在直接在这个位置的基础上走nums[i]步,主要保证能一直前进,就能达到终点;
那么,什么时候才不能一直前进呢?
答案是,遇到0的时候,遇到nums[i]=0的时候,只要我们想办法跳过这个0,那么就可以确保我们可以继续前进。
所以遇到0时的处理方法是,往回搜索,设当前的位置为pos,即nums[pos]=0,一直搜索之前的数,判断nums[i]+i是否大于nums[pos],大于则可以继续上述的贪心算法,假如一直跳不过0(即搜索到i=0仍跳不过pos),则return false。
代码如下:
class Solution { public: bool canJump(vector<int>& nums) { if(nums.size()==1) return true; int pos=0; while(pos<nums.size()-1) { if(nums[pos]!=0) {//走最远的位置 pos=nums[pos]+pos; } else {//如果最远的位置为0 int now=pos; for(int i=pos;i>=0;i--) {//找到能跳过0的位置 if(i+nums[i]>now) { pos=i+nums[i]; break; } } if(pos==now) {//找不到跳过0,则false return false; } } } return true; } };
二、
记录两个变量,一个是当前能达到的最远距离,另外一个是下一次能达到的最远距离。
O(n)的时间复杂度和O(1)的空间复杂度。
在到达当前最远距离前(包括当前最远距离),不断更新下一次能达到的最远距离。当到达了当前最远距离,除了更新nextMaxPos,还需要把currentMaxPos=nextMaxPos,nextMaxPos=0
下面为AC代码:
class Solution { public: bool canJump(vector<int>& nums) { if(nums.size()==1) return true; int currentMaxPos=nums[0]; int nextMaxPos=0; for(int i=0;i<nums.size();i++) { if(i<currentMaxPos) {//更新下一次能达到的最远距离 nextMaxPos=max(nextMaxPos,i+nums[i]); if(nextMaxPos>=nums.size()-1) return true; } else if(i==currentMaxPos) {//达到当前最远的位置了,更新下一次能到达的最远距离,并且更新currentMaxPos和NextMaxPos nextMaxPos=max(nextMaxPos,i+nums[i]); if(nextMaxPos>=nums.size()-1) return true; currentMaxPos=nextMaxPos; nextMaxPos=0; } else {//更新当前能到的最远位置,把下一次能达到的最远距离清零 currentMaxPos=nextMaxPos; nextMaxPos=0; } } if(nextMaxPos>=nums.size()-1||currentMaxPos>=nums.size()-1) return true; else return false; } };
相关文章推荐
- leetcode:Pascal's Triangle II
- memmem()和strstr()函数
- setTimeout()和setInterval()小结
- Monkey log分析说明
- Jump Game (Medium)
- 合并两个排序的链表
- 用贪心算法解决背包问题
- LEETCODE--Pascal's Triangle
- [213]House Robber II
- LightOJ 1013 - Love Calculator(dp)
- 三维绘图之OpenGL和Qt的结合
- HDOJ 练习题 memset 和malloc 函数的用法
- LightOJ 1011 - Marriage Ceremonies(dp)
- iOS label自适应高度
- 关于百度地图的应用android开发步骤
- OD调试15
- 像js函数中传递对象参数
- 用position实现布局
- LightOJ 1005 - Rooks(计数)
- lightoj 1294 Positive Negative Sign