LeetCode 45. 跳跃游戏 II | Python
45. 跳跃游戏 II
题目来源:https://leetcode-cn.com/problems/jump-game-ii
题目
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
- 假设你总是可以到达数组的最后一个位置。
解题思路
思路:贪婪算法
首先,先注意题意的说明部分【假设你总是可以到达数组的最后一个位置】。这里只需要考虑,题目中所给出的数组,是一定能够到达数组的最后一个位置。
这题要求与之前 55. 跳跃游戏 并不相同,55 题要求的返回是否能够到达最后一个位置。如果用 55 题的反例来论证本题意义不大,若觉得有必要,也可以在无法到达时返回特定的值用以标记,例如 0。
现在考虑如何去求得到达最后位置的最小跳跃次数?
在这里,我们考虑使用正向去找可到达的最远位置。这里以示例 1 为例,[2,3,1,1,4],索引为 0 的位置,这里元素值为 2,表示该位置能够跳跃到达的位置为后续两个位置,如下图所示红色部分:
在这里,索引为 1 的位置中,元素值值为 3,表示能够后续三个位置,能到达最远的位置为索引 4,这里已经到达末尾位置。而索引 2 的位置中,值为 1,这里只能跳跃到索引为 3 的位置。这里显然从索引 1 的位置跳跃能到达更远的位置。
假设数组后续还未到达末尾,,现在选择先跳到索引 1 的位置,上面说能够在该位置能跳跃到后续三个位置,这里如何选择落脚的地方?跟上面讨论的一样,在每个可到达的位置,判断各自能够跳跃的最远的位置。
现在位置在索引 1 的位置上面,如下图所示,3 个红色部分就是索引 1 这个位置能够跳跃的选择,而跳到索引 4 的位置,能够跳跃更远的位置,所以此处是当前最好的落脚点。
现在考虑如何实现?我们可以维护这个可到达的最远位置,作为边界。当我们正向遍历的时候,当到达边界时,就更新这个边界,相应的跳跃次数加 1。
这里需要注意一点,我们从正向遍历的时候,不用遍历最后一个位置。根据上面的说明知道,这里一定会到达最后一个位置。那么前面所述的需要维护的这个边界,一定是大于或等于最后那个位置的。如果边界刚好就在最后的位置时,按照前所述的到达边界时,更新边界,跳跃次数加 1 的逻辑,这里会增加不必要的跳跃次数。所以不考虑访问这个最后的位置。
具体的代码实现如下。
代码实现
class Solution:
def jump(self, nums: List[int]) -> int:
# 定义最远位置,边界,步数
max_pos = 0
end = 0
steps = 0
for i in range(len(nums) - 1):
# 获取最远可到达位置
max_pos = max(max_pos, i + nums[i])
# 到达边界时,更新边界
# 同时跳跃次数加 1
if i == end:
end = max_pos
steps += 1
return steps
实现结果
以上就是使用贪心算法,从数组开始正向遍历,维护可跳跃最远的位置,确定边界,到达边界时,更新边界,增加跳跃次数,进而解决《45. 跳跃游戏 II》问题的主要内容。
欢迎关注微信公众号《书所集录》
LeetCode 45. 跳跃游戏 II | Python的更多相关文章
- Java实现 LeetCode 45 跳跃游戏 II(二)
45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...
- [leetcode] 45. 跳跃游戏 II(Java)(动态规划)
45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...
- 力扣Leetcode 45. 跳跃游戏 II - 贪心思想
这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...
- [LeetCode] 45. 跳跃游戏 II
题目链接 : https://leetcode-cn.com/problems/jump-game-ii/ 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位 ...
- leetcode 45. 跳跃游戏 II JAVA
题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1, ...
- leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II
55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...
- LeetCode 45跳跃游戏&46全排列
原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...
- 【LeetCode】跳跃游戏II
[问题]给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [,,,,] 输出: ...
- 45. 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4]输出 ...
随机推荐
- Python 0(安装及初步使用+学习资源推荐)
不足之处,还请见谅,请指出不足.本人发布过的文章,会不断更改,力求减少错误信息. Python安装请借鉴网址https://www.runoob.com/python/python-install.h ...
- 选择排序(C++,Java,Python实现)
排序算法之选择排序,选择排序,选择排序的基本思想描述为:每一趟在n-i+1(i=1,2,-,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.具体来说,假设长度为n的数组arr,要按照从小 ...
- Apache SkyWalking
Apache SkyWalking 什么是 SkyWalking SkyWalking 是观察性分析平台和应用性能管理系统. 提供分布式追踪.服务网格遥测分析.度量聚合和可视化一体化解决方案. 支持J ...
- 【Java】InnerClass 内部类
Java 允许一个类的定义位于另一个类的内部,前者为内部类,后者称为外部类 InnerClass一般定义它的类或语句块之中外部类引用时必须给出完整的名称 成员内部类 & 局部内部类 - 静态成 ...
- 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...
- Linux-设备
一.在Linux系统中,每个设备都被当成一个文件来对待. 在Linux系统中,几乎所有的硬件设备都在/dev这个目录内.
- 如何用python批量生成真实的手机号码
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Python测试社区 1目 标 场 景 平时在工作过程中,偶尔会需要大 ...
- HashMap主要方法源码分析(JDK1.8)
本篇从HashMap的put.get.remove方法入手,分析源码流程 (不涉及红黑树的具体算法) jkd1.8中HashMap的结构为数组.链表.红黑树的形式 (未转化红黑树时) (转 ...
- E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)
题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...
- 浏览器中 JS 的事件循环机制
目录 事件循环机制 宏任务与微任务 实例分析 参考 1.事件循环机制 浏览器执行JS代码大致可以分为三个步骤,而这三个步骤的往复构成了JS的事件循环机制(如图). 第一步:主线程(JS引擎线程)中执行 ...