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]输出 ...
随机推荐
- 2020-3-3 20175110王礼博 《网络对抗技术》Exp1 PC平台逆向破解
目录 1.实践目标与基础知识 2.直接修改程序机器指令,改变程序执行流程 3.通过构造输入参数,造成BOF攻击,改变程序执行流 4.注入Shellcode并执行 5.实验收获与感想 6.什么是漏洞?漏 ...
- java异常处理:finally中不要return
java异常处理:finally中不要return 复制代码 public class Ex1 { public static void main(String[] args) { System.ou ...
- 生成3D多棱柱的方法(3D立体图片)
先上一个效果图 主要运用的技术点就是 确认基点,确认每个盒子旋转的度数 3D变换 transform: rotateY(-360deg); 景深 perspective 3D舞台 transfor ...
- 收集免费的接口服务,做一个api的搬运工
hello, 大家好,今天给大家推荐的开源项目在某种程度上极大的方便了广大的开发者,这个开源项目统计了网上诸多的免费API,为广大开发者收集免费的接口服务,专心致志做一个API的搬运工,每月定时更新新 ...
- Python 小技之实现的鲜花盛宴,你准备好了吗?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:派森酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- work of weekend 12/12/2015~12/14/2015
part 组员 周末工作+今日工作 工作耗时/h 明日计划 工作耗时/h backup 冯晓云 try the backup plan:brower:rewrite bi ...
- I. Same String
有两个只由小写字母组成的长度为n的字符串s1,s2和m组字母对应关系,每一组关系由两个字母c1和c2组成,代表c1可以直接变成c2,你需要判断s1是否可以通过这m组关系转换为s2. 输入格式 第一行输 ...
- Flask接口开发过程中的心得2019.10.03
完善了一下慕课网实战中的post接口开发,得到了一些进步: 代码如下: #coding=utf-8 from flask import Flask from flask import request ...
- React AntDesign 引入css
React项目是用umi脚手架搭建的AntDesign,用到一个第三方表格组件Jexcel,npm install 之后组件的样式加载不上,犯了愁,翻阅各种资料,踏平两个小坑. 大家都知道,安装完成的 ...
- linux常用命令--文件的权限
ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u).群组(g)以及其他人(o ...