跳跃游戏 II

题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

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

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法
  • 首先,如果nums的长度为1,因为不需要走,直接返回0;
  • 如果nums的长度为2,由于一定可以到达最后一个位置,而且至少需要一步,直接返回1;
  • 当不是前两种情况时,首先,声明一个变量length为数组最大的索引位,声明一个变量result记录最少的跳跃次数,初始化为最大的的int值,声明一个HashMap为toJumpTimes记录跳跃过的位置和相应跳跃到该位置最少的步数,声明一个队列toJump记录当前走到的位置,声明一个队列times同步记录走到当前位置需要的步数,首先,将0加入到jumped和times,然后遍历队列toJump按照以下过程处理:
    • 从队列中取出一位cur;
    • 如果cur对应的数组的值为0,则跳过处理下一个队列中的值;
    • 判断toJumpTimes中是否存在该位置的索引,如果存在且走到当前位置的步数多于其他走法走到当前位置的步数,则跳过处理下一个;
    • 如果cur对应的数组的值大于等于length-cur即可以从当前位置直接跳跃到最后一位,则判断如果当前的跳跃次数小于result,则更新result的值;
    • 否则,如果当前跳跃次数不小于result,则跳过处理下一个;如果当前跳跃次数小于result,则将cur+1 ~ cur+nums[cur]索引位添加到toJump,添加之前需要判断toJumpTimes的key中是否存在当前索引位:
      • 如果不存在并且当前跳跃次数小于result,则把当前索引位和相应的跳跃次数添加到toJump和times和toJumpTimes;
      • 如果存在并且当前跳跃次数小于最小的跳跃次数,则把当前索引位和相应的跳跃次数添加到toJump和times,并且更新当前索引位在toJumpTimes中的最少跳跃次数。

最后,返回result即为最少跳跃次数。

说明:处理方法类似于 LeetCode-055-跳跃游戏 这道题目。

import java.util.*;

public class LeetCode_045 {
public static int jump(int[] nums) {
if (nums.length == 1) {
return 0;
}
if (nums.length == 2) {
return 1;
}
int result = Integer.MAX_VALUE;
int length = nums.length - 1;
// 定义走到过的位置,并且记录走到当前位置最少的步数
Map<Integer, Integer> toJumpTimes = new HashMap<>();
toJumpTimes.put(0, 0);
// 定义当前到的位置
Stack<Integer> toJump = new Stack<>();
Stack<Integer> times = new Stack<>();
toJump.push(0);
times.push(0);
while (!toJump.isEmpty()) {
Integer cur = toJump.pop();
Integer curTimes = toJumpTimes.get(cur);
if (nums[cur] == 0) {
continue;
}
// 判重,如果走到当前位置的步数多于其他走法走到当前位置的步数,则跳过处理下一个
if (toJumpTimes.containsKey(cur) && curTimes > toJumpTimes.get(cur)) {
continue;
}
if (nums[cur] >= length - cur) {
if (curTimes + 1 < result) {
result = curTimes + 1;
}
} else {
if (curTimes + 1 >= result) {
continue;
}
for (int i = 1; i <= nums[cur]; i++) {
if (!toJumpTimes.containsKey(cur + i)) {
if (curTimes + 1 < result) {
toJumpTimes.put(cur + i, curTimes + 1);
toJump.push(cur + i);
times.push(curTimes + 1);
}
} else {
Integer time = toJumpTimes.get(cur + i);
if (curTimes + 1 < time) {
toJumpTimes.put(cur + i, curTimes + 1);
toJump.push(cur + i);
times.push(curTimes + 1);
}
}
}
}
}
return result;
} public static void main(String[] args) {
int[] nums = new int[]{2, 3, 1, 1, 4};
System.out.println(jump(nums));
}
}

【每日寄语】 要铭记在心:每天都是一年中最美好的日子。

LeetCode-045-跳跃游戏 II的更多相关文章

  1. LeetCode 45. 跳跃游戏 II | Python

    45. 跳跃游戏 II 题目来源:https://leetcode-cn.com/problems/jump-game-ii 题目 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素 ...

  2. Java实现 LeetCode 45 跳跃游戏 II(二)

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

  3. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  4. [leetcode] 45. 跳跃游戏 II(Java)(动态规划)

    45. 跳跃游戏 II 动态规划 此题可以倒着想. 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 ...

  5. leetcode 45. 跳跃游戏 II JAVA

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

  6. [LeetCode] 45. 跳跃游戏 II

    题目链接 : https://leetcode-cn.com/problems/jump-game-ii/ 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位 ...

  7. 【LeetCode】跳跃游戏II

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

  8. Leetcode力扣45题 跳跃游戏 II

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

  9. leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II

    55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...

  10. lintcode: 跳跃游戏 II

    跳跃游戏 II 给出一个非负整数数组,你最初定位在数组的第一个位置. 数组中的每个元素代表你在那个位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 样例 给出数组A =  ...

随机推荐

  1. 从服务之间的调用来看 我们为什么需要Dapr

    Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...

  2. 布客&#183;ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.2

    特约赞助商 公告 我们愿意普及区块链技术,但前提是互利互惠.我们有大量技术类学习资源,也有大量的人需要这些资源.如果能借助区块链技术存储和分发,我们就能将它们普及给我们的受众. 我们正在招募项目负责人 ...

  3. 计算机电子书 2019 BiliDrive 备份

    下载方式 pip install BiliDriveEx bdex download <link> 链接 文档 链接 传智播客轻松搞定系列 C.C++.Linux.设计模式.7z (33. ...

  4. 「ZJOI2017」树状数组

    「ZJOI2017」树状数组 以下均基于模2意义下,默认\(n,m\)同阶. 熟悉树状数组的应该可以发现,这题其实是求\(l-1\)和\(r\)位置值相同的概率. 显然\(l=1\)的情况需要特盘. ...

  5. (DDS)正弦波形发生器——幅值、频率、相位可调(二)

    (DDS)正弦波形发生器--幅值.频率.相位可调(二) 主要关于调相方面 一.项目任务: 设计一个幅值.频率.相位均可调的正弦波发生器. 频率每次增加10kHz 相位每次增加 PI/2 幅值每次增加两 ...

  6. VMware网络连接模式(桥接、NAT以及仅主机模式的详细介绍和区别)

    VMware 桥接模式 VMware桥接模式,也就是将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络(例如图中所示的局域网 ...

  7. @property基本概念

    1.什么是@property @property是编译器的指令 什么是编译器的指令 ? 编译器指令就是用来告诉编译器要做什么! @property会让编译器做什么呢? @property 用在声明文件 ...

  8. Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/zeppelin/server/ZeppelinServer : Unsupported major.minor version 52.0

    在启动Zeppelin时遇到了该问题: [root@quickstart bin]# ./zeppelin-daemon.sh restart Please specify HADOOP_CONF_D ...

  9. Docker Explore the application

    https://docs.docker.com/docker-for-mac/#explore-the-application   Open a command-line terminal and t ...

  10. 【多线程与高并发原理篇:1_cpu多级缓存模型】

    1. 背景 现代计算机技术中,cpu的计算速度远远高于主内存的读写速度.为了解决速度不匹配问题,充分利用cpu的性能,在cpu与主内存之间加入了多级缓存,也叫高速缓存,cpu读取数据直接从高速缓存中读 ...