Lintcode117 Jump Game || solution 题解
来源:互联网 发布:2017淘宝贷款15万骗局 编辑:程序博客网 时间:2024/05/21 04:20
【题目描述】
Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Your goal is to reach the last index in the minimum number of jumps.
给出一个非负整数数组,你最初定位在数组的第一个位置。
数组中的每个元素代表你在那个位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
【题目链接】
www.lintcode.com/en/problem/jump-game-ii/
【题目解析】
将每个位置都看作一个点,并从第i个点向它之后的nums[i]个点都连一条长度为1的有向边,而现在的问题就是从0号点到达size-1号点需要的最短距离,这就是一个很简单的最短路问题,实际上由于边的长度均为1,而且不存在环,我们可以用宽度优先搜索(时间复杂度为O(n^2),即边数)来进行相关的计算。
不难发现,这道题目转换出的最短路问题存在三个条件:
·边的长度均为1
·不存在环
·连出的边是连续的
如果令f[i]表示从0号点到达i号点的最短路径,那么对于任意i
然后,对于f数组来说,它会是一段段的存在,先是一个0,然后是一段1,然后是一段2,依此类推,那么现在问题来了,每一段的长度是多少呢?
如果我们令l[k]表示f数组中值为k的一段的左边界,r[k]表示f数组中值为k的一段的有边界,那么有
·l[k] = r[k - 1] + 1,这是显然的
·r[k] = max{i + nums[i] | l[k - 1] <= i <= r[k - 1]},由于f值为k的位置一定是从f值为k-1的位置走来的,所以只需要看从所有f值为k-1的位置里最远可以到达的地方即可。
也就是说,我们可以在对nums的一遍扫描中,依次求出所有的l[k]和r[k],而f数组也就自然求解出来了——答案也就得到了。
【参考答案】
www.jiuzhang.com/solutions/jump-game-ii/
- Lintcode117 Jump Game || solution 题解
- Lintcode116 Jump Game solution 题解
- LeetCode题解:Jump Game
- leetcode Jump Game II 题解
- LeetCode 题解(171): Jump Game
- Leetcode题解:55. Jump Game
- [LeetCode题解]55.Jump Game
- The Solution to Leetcode 55 Jump Game
- LeetCode 55. Jump Game and 45. Jump Game II 题解
- LeetCode 55. Jump Game & 45. Jump Game II题解
- LeetCode 题解(49): Jump Game II
- LeetCode 45 Jump Game II 题解
- leetcode题解-45. Jump Game II
- leetcode题解-55. Jump Game && 56. Merge Intervals
- Jump Game
- Jump Game
- Jump Game
- Jump Game
- 围成圈,报号
- Stream流操作
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- QGraphicsItem获取不到鼠标事件
- 欢迎使用CSDN-markdown编辑器
- Lintcode117 Jump Game || solution 题解
- Java中类的反射机制
- Windows下创建用户不能使用的字符
- Ubuntu环境下搭建Hadoop Eclipse开发环境
- PL/SQL Developer使用总结
- 如何简单地理解Python中的if __name__ == '__main__'
- 常见浏览器兼容性问题与解决方案
- Android开发之Intent详解
- 通熟易懂的反射机制