[Leetcode]44.跳跃游戏Ⅰ&&45.跳跃游戏Ⅱ
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
思路:
如果只是判断能否跳到终点,我们只要在遍历数组的过程中,更新每个点能跳到最远的范围就行了,
如果最后这个范围大于等于终点,就是可以跳到。
class Solution {
private:
inline int max(const int a,const int b){return a>b?a:b;}
public:
bool canJump(vector<int>& nums) {
int count=;
for(int i=;i<nums.size()&&i<=count;i++){
count=max(count,i+nums[i]);
}
if(count<nums.size()-)return false;
return true;
}
};
跳跃游戏Ⅱ
现在来看跳跃问题一的衍生:
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是2。
从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
第一种方法: 动态规划(超时)
定义状态dp[i]:到达位置i的最小步数
初始化dp: 0x3f3f3f3f,即一个极大值。
状态转移方程:对每个位置i为起点可以到达的位置j,都有dp[j]=min(dp[i]+1,dp[j]);
最后想要的结果:dp[n-1]
时间复杂度:O(n^2)
class Solution {
private: inline int min(const int a,const int b){return a>b?b:a;}
public:
int jump(vector<int>& nums) {
int n=nums.size();
int dp[n];
memset(dp,0x3f,sizeof(dp));
/*初始化成最大值*/
dp[]=;
for(int i=;i<n-;i++){
for(int j=i+;j<n&&j<=i+nums[i];j++)
dp[j]=min(dp[i]+,dp[j]);
}
return dp[n-];
}
};
第二种方法:贪心算法
我们可以把整个数组分成很多个区域,
把样例[2,3,1,1,4]拿来做例子:
[2,3,1,1,4] 可以分成如左边三个区域,第i个区域代表从起点可以通过i-1步到达这些区域。
如何求上述分成上述区域呢?如下递归定义:
第1个区域就是起始位置一个。
第n个区域为(第n-1个区域最远的位置, 第n-1个区域为起点所到达的最远位置]
如何求这些区域呢,实际上可以遍历的过程中动态的求。
我们需要每次遍历的时候更新这些区域,实际上我们就用了两个变量currentReach和newReach区分区域,
前者记录现在区域的最远位置,newReach代表从这个区域能到达的最远位置。有上面我们可以知道下一个区域的范围为(currentReach,newReach]
因为我们只考虑最后一个点在第ans个区域而答案就是ans-1。遍历的过程中如果下标大于currentReach,说明进入了一个新的区域,区域就要更新。
newReach要不断更新的原因是,在到达currentReach前,我们并不知道从现在区域到达的最远位置,必须不断更新寻找。
代码如下:
class Solution {
inline int max(const int a,const int b){return a>b?a:b;}
public:
int jump(vector<int>& nums) {
int newReach=;//记录从现在区域出发能到达的最远位置
int ans=;//记录次数
int currentReach=;//记录现在区域的最远位置
int n=nums.size();
for(int i=;i<n;i++){
if(i>currentReach){//超过现在区域的最远位置,说明进入了一个新区域,ans++
ans++;
currentReach=newReach;//更新现在区域的最远位置
}
newReach=max(newReach,i+nums[i]);//每次都更新从此区域出发的最远到达位置
}
return ans;
}
};
[Leetcode]44.跳跃游戏Ⅰ&&45.跳跃游戏Ⅱ的更多相关文章
- 贪心——55. 跳跃游戏 && 45.跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...
- LeetCode 45. 跳跃游戏 II | Python
45. 跳跃游戏 II 题目来源:https://leetcode-cn.com/problems/jump-game-ii 题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素 ...
- Java实现 LeetCode 45 跳跃游戏 II(二)
45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...
- LeetCode 45跳跃游戏&46全排列
原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...
- [leetcode] 45. 跳跃游戏 II(Java)(动态规划)
45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...
- leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II
55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...
- Unity中制作游戏的快照游戏支持玩家拍快照
Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游 ...
- C#开发Unity游戏教程之游戏对象的行为逻辑方法
C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...
- 直接操作游戏对象C#游戏开发
直接操作游戏对象C#游戏开发 2.2.3 直接操作游戏对象 在Inspector视图里通过设置属性而改变游戏场景中游戏对象的状态,太过抽象,毕竟数字并不够直观.其实,改变游戏对象的状态,完全有最最直 ...
随机推荐
- php-fpm超时时间设置request_terminate_timeout分析
之前发现一个php配置之后关于返回500和502的问题,今天看到一个兄弟写的非常不错,记录一下. php日志中有一条超时的日志,但是我request_terminate_timeout中设置的是0 ...
- 2019.02.09 bzoj1042: [HAOI2008]硬币购物(完全背包+容斥原理)
传送门 题意简述:有四种面值的硬币,现在qqq次询问(q≤1000)(q\le1000)(q≤1000),每次给出四种硬币的使用上限问最后刚好凑出sss块钱的方案数(s≤100000)(s\le100 ...
- 2018.11.06 bzoj1835: [ZJOI2010]base 基站选址(线段树优化dp)
传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j) ...
- TCP/IP协议(6):传输层之UDP
一. UDP用户数据报协议,它是一个无连接的,面向数据报的协议,它不提供可靠性但传输速度比TCP要快. UDP数据报中的“UDP长度”为两个字节,所以我们要发送的UDP数据最多支持65507大约68K ...
- PKG_CONFIG_PATH变量 与 ld.so.conf 文件
一.编译和连接 一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I 参数指定其路径.由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安 ...
- Kotlin零碎总结
1.对于Kotlin的包方法其实对应Java而言是静态方法,如Entrance.kt文件的外部有fun main(...方法,那么编译成字节码后就是Java的Entrance类里有public sta ...
- Andorid第一次作业
一.作业截图 二.项目路径 https://git.coding.net/bestimbalance/Android.git 三.小组成员 邢路: https://www.cnblogs.com/x ...
- SQL编写-谁和谁是好朋友
problem: 用户表 姓名 张三 李四 王五 好友表 姓名 好友姓名 张三 李四 张三 王五 李四 张三 用户表里面姓名必须在好友表里面互加为好友,请问如何找出还没有加为好友的姓名 ...
- C/C++ %s %d %u 基本概念与用法
%d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的 ...
- 查看和杀死进程ps
$ps -ef #查看执行的进程. $ps -aux | grep java #查看java进程 $sudo kill 进程号 [1] http://www.cnblogs.com/peida/arc ...