题目:

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.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

Hide Tags

Array Greedy

链接: http://leetcode.com/problems/jump-game-ii/

题解:

在Jump Game基础上还要计算最小jump数,所以除了maxCover外还需要维护一个lastCover。在当前i值超过lastCover所处index时,我们要把steps数加1。在循环结束后再判断是否满足能到达最后一个index,假如可以,返回steps,不可以则返回0。

Time Complexity - O(n), Space Complexity - O(1)。

public class Solution {public int jump(int[] nums) {if(nums == null || nums.length == 0)return 0;int maxCover = 0, lastCover = 0, steps = 0;for(int i = 0; i < nums.length && i <= maxCover; i++){if(i > lastCover){steps++;lastCover = maxCover;}if(i + nums[i] > maxCover)maxCover = i + nums[i];}if(maxCover >= nums.length - 1)                return steps;return 0;}
}

二刷:

主要是使用了一种Greedy的思想来求最小步数。

  1. 首先我们设置不满足题意的corner case返回Integer.MAX_VALUE
  2. 接下来设置一个maxCover = 0, lastCover = 0, steps = 0。 maxCover代表我们当前能够到达的最大距离,lastCover等于之前的maxCover,用来记录我们在Greedy情况下每一跳的最远范围。
  3. 从0开始遍历数组,要注意条件是 i <= maxCover && i < nums.length
    1. 假如i > lastCover,这时候说明我们已经超过了之前记录的maxCover的范围,这个时候我们必须要进行一次跳跃,所以steps++,并且我们更新lastCover = maxCover,即上一条之后,我们这一次最远可以跳到哪里
    2. 假如i + nums[i] > maxCover, 这个时候我们更新maxCover = i + nums[i],可以继续进行接下来的计算
  4. 当循环结束时,我们检测maxCover是否 >= nums.length - 1
    1. 假如成立,则说明我们可以到达右边界,这时候返回steps
    2. 否则我们返回Integer.MIN_VALUE

看了一下discuss,这道题也可以用BFS来做。就是假设现在在0, 我们可以reach到 nums[0],  那我们接下来处理的就是在nums[0]范围内的数字,比如 1 和 2, 然后根据1 和 2的范围再继续找到下一层BFS,最后当范围包括到最后一个节点的时候我们返回这个层数。其实等同于一个非加权图中两点间最短路径问题。但没仔细看代码,复杂度怎么计算还不知道。

Java:

Time Complexity - O(n), Space Complexity - O(1)

public class Solution {public int jump(int[] nums) {if (nums == null || nums.length == 0) {return Integer.MAX_VALUE;}int maxCover = 0, lastCover = 0, steps = 0;for (int i = 0; i <= maxCover && i < nums.length; i++) {if (i > lastCover) {lastCover = maxCover;steps++;}if (i + nums[i] > maxCover) {maxCover = i + nums[i];}}return maxCover >= nums.length - 1 ? steps : Integer.MAX_VALUE;}
}

三刷:

方法跟上面一样。另外设置一个lastCover变量,每次当i > lastCover的时候,我们更新steps,并且设置lastCover = maxCover

Java:

public class Solution {public int jump(int[] nums) {if (nums == null || nums.length == 0) return 0;int maxCover = 0, lastCover = 0, steps = 0;for (int i = 0; i < nums.length && i <= maxCover; i++) {if (i > lastCover) {steps++;lastCover = maxCover;}maxCover = Math.max(maxCover, i + nums[i]);}return (maxCover >= nums.length - 1) ? steps : Integer.MAX_VALUE;}
}

update:

当maxCover >= nums.length - 1时,我们可以跳过后面的计算。

public class Solution {public int jump(int[] nums) {if (nums == null || nums.length == 0) return 0;int maxCover = 0, lastCover = 0, steps = 0;for (int i = 0; i < nums.length && i <= maxCover; i++) {if (i > lastCover) {steps++;lastCover = maxCover;}maxCover = Math.max(maxCover, i + nums[i]);if (maxCover >= nums.length - 1) {if (lastCover >= nums.length - 1) return steps;else return steps + 1;}}return Integer.MAX_VALUE;}
}

Reference:

https://leetcode.com/discuss/10588/o-n-bfs-solution

https://leetcode.com/discuss/13293/sharing-my-ac-java-solution

https://leetcode.com/discuss/30647/single-loop-simple-java-solution

https://leetcode.com/discuss/45992/10-lines-c-16ms-python-bfs-solutions-with-explanations

https://leetcode.com/discuss/67047/concise-o-n-one-loop-java-solution-based-on-greedy

45. Jump Game II相关推荐

  1. 【leetcode】45. Jump Game II 非负数组的最少跳跃步数

    1. 题目 Given an array of non-negative integers, you are initially positioned at the first index of th ...

  2. 45 jump game II(贪心)

    文章目录 1:题目描述 2:解决方法 1:题目描述 给一个元素非负的数组,你开始是在第一个元素上 每一个元素都代表你在当前位置最大可跳的长度 你的目标是到达最后一个位置,用最小的跳数 你总是可以到达最 ...

  3. 45. Jump Game II(跳跃游戏II)

    原题链接:https://leetcode.com/problems/jump-game-ii/ 这道题比较适合用贪心来做,局部的最优解最后刚好是整体的最优解. 如下图,开始的位置是 2,可跳的范围是 ...

  4. 55/45 Jump Game 跳跃游戏

    55 Jump Game 思路:贪心算法,每次记录可以跳到的最远距离. class Solution { public:bool canJump(vector<int>& nums ...

  5. 45. 跳跃游戏 II golang 动态规划

    45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

  6. Leetcode 45. 跳跃游戏 II

    Leetcode 45. 跳跃游戏 II 题目 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组 ...

  7. Leetcode-D21-动态规划(二刷)-55. 跳跃游戏45. 跳跃游戏 II

    我导好好啊!!!刚找完他!充满动力,给个大标题! 55. 跳跃游戏 1.感觉不像是一道很明显的动态规划问题. 2.看下答案和自己的思路是否一致.和我的想法一下,敲代码叭! 3.通过了,但这次好慢呀 c ...

  8. leetcode 45. 跳跃游戏 II 46. 全排列

    leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...

  9. LeetCode 45.跳跃游戏II

    45.跳跃游戏 II 题目描述 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. ...

最新文章

  1. 实现在CentOS7环境下搭建个人github博客
  2. 转载:SendMessage()这个函数有很多奇妙的用途
  3. js循环判断有无重复值_JavaScript中的while循环
  4. linux 内核 sleep,linux内核是如何支持深度睡眠(deep sleep)方式的?
  5. python提取文件名的5-6位_python提取文件名
  6. Python第三方库的安装,升级以及版本查看
  7. archery docker部署
  8. winform button设计(一)
  9. 搭建Hadoop集群
  10. SAS (Statistics Analysis System) 统计分析系统软件
  11. 【python】google的经纬度定位查询API
  12. 机器视觉:高动态范围图像
  13. Windows PE(WinPE)
  14. ECCV 2020 论文大盘点-语义分割篇
  15. C# chart画折线
  16. .NET反编译:使用NET.Reflector+Reflexil插件相结合实现对DLL文件的修改操作
  17. 记vscode配置踩坑经过
  18. 51单片机与STM32的区别(为何51单片机IO引脚的驱动能力弱)
  19. 网页访问的服务器和端口怎么查,怎么查看网页访问端口号
  20. NASA发布史上最深的宇宙全彩照!韦伯如何回传150万公里外的太空数据?

热门文章

  1. Uber发布了Ludwig,一款不使用代码的人工智能开发工具
  2. Adaboost 算法的原理与推导
  3. 牛津、剑桥、OpenAI 等多家机构发布重磅报告,论述恶意人工智能的「罪与罚」
  4. torch中tensor的普通索引以及index_select()
  5. 数据挖掘关联规则挖掘改进算法DHP
  6. 机器学习获量子加速!物理学家与计算科学家「自然联姻」
  7. 美智库:下一代国防战略之竞争战略
  8. 【技术趋势】2020 五大技术趋势:无人驾驶发展、机器视觉崛起、区块链实用化、人类增强技术、超自动化...
  9. 信息太多,时间太少: 大脑如何区分重要和不重要的事?
  10. 这个“大脑”收获一份大奖!