Jump Game (Medium)
主要有两种思路:
一、
本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置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;
}
};
Jump Game (Medium)的更多相关文章
- [array] leetcode-55. Jump Game - Medium
leetcode-55. Jump Game - Medium descrition Given an array of non-negative integers, you are initiall ...
- [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- [LeetCode] 系统刷题5_Dynamic Programming
Dynamic Programming 实际上是[LeetCode] 系统刷题4_Binary Tree & Divide and Conquer的基础上,加上记忆化的过程.就是说,如果这个题 ...
- [LeetCode] All questions numbers conclusion 所有题目题号
Note: 后面数字n表明刷的第n + 1遍, 如果题目有**, 表明有待总结 Conclusion questions: [LeetCode] questions conclustion_BFS, ...
- [LeetCode] questions conclusion_ Dynamic Programming
Questions: [LeetCode] 198. House Robber _Easy tag: Dynamic Programming [LeetCode] 221. Maximal Squar ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- LeetCode解题报告汇总! All in One!
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 把自己刷过的所有题目做一个整理,并且用简洁的语言概括了一下思路,汇总成了一个表格. 题目 ...
随机推荐
- 程序Dog的大梦想
一.我是程序狗 "怎么又是任宏啊,每天都起这么早,要命啊--" "人家任宏可是要成为学霸的男人,咱们这些凡夫俗子啊,理解不了这么伟大的理想--"----微电影& ...
- HDU 2586 How far away ?【LCA模板题】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给你N个点,M次询问.1~N-1行输入点与点之间的权值,之后M行输入两个点(a,b)之间的最 ...
- Spring Cloud Alibaba 教程 | Nacos(三)
使用Nacos作为配置中心 前面我们已经介绍过滤Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.所以它可以作为注册中心和配置中心,作为注册中心Nacos可以让我们灵活配置多 ...
- 第4章 ZK基本特性与基于Linux的ZK客户端命令行学习
第4章 ZK基本特性与基于Linux的ZK客户端命令行学习 4-1 zookeeper常用命令行操作 4-2 session的基本原理与create命令的使用
- 关于Linux常用命令的使用
Linux常用命令 Linux centos常用镜像下载链接:http://mirror.centos.org/centos 一.关于yum 1.下载rpm包并存放至某个路径 命令:#yum inst ...
- C语言 指针在函数传参中的使用
int add(int a, int b) //函数传参的时候使用了int整型数据,本身是数值类型.实际调用该函数时,实参将自己拷贝一份,并将拷贝传递给形参进行运算.实参自己实际是不参与运算的.所 ...
- zookeeper注册中心和客户端
1.zookeeper和eureka区别 zookeeper向client进行ping操作,如果不通,就删除client节点 eureka自我保护机制是client向注册中心发送心跳包,如果一定时间内 ...
- 使用sshfs
寻找winscp在mac下的代替品, 没有找到. 但找到一个更好用的方法: 通过sshfs挂载文件目录,当作普通文件夹使用. 使用方法 sshfs -o defer_permissions -o no ...
- mac 编程环境
新mac (EI Capitan),需要在python中使用xgboost,通过pip安装未成功. 配置pip cat $HOME/Library/Application\ Support/pip/p ...
- 吴裕雄--天生自然 pythonTensorFlow自然语言处理:Seq2Seq模型--测试
import sys import codecs import tensorflow as tf # 1.参数设置. # 读取checkpoint的路径.9000表示是训练程序在第9000步保存的ch ...