跳跃游戏

力扣题目链接(opens new window)

给定一个非负整数数组,你最初位于数组的第一个位置。

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

判断你是否能够到达最后一个位置。

示例 1:

  • 输入: [2,3,1,1,4]
  • 输出: true
  • 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

  • 输入: [3,2,1,0,4]
  • 输出: false
  • 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置

思路

题目只需要判断能不能跳到终点,还是比较好想的

根据示例和题目说明,"可以跳跃的最大长度"的定义如下:(注意,其本身也算一个可跳跃距离)

  1. [2,3,1,1,4]
  2. -----

2的跳跃范围是虚线内([2,3,1])

然后我们可以遍历当前元素的可跳跃范围,找到更大的数去扩大可跳跃范围

例如当遍历到3时,可遍历范围扩大至最后一个位置

  1. [2,3,1,1,4]
  2. -------

此时就满足了题目的条件,可以返回true

用贪心的话术来说就是:

局部最优解:每次遍历时争取最大的当前遍历值去更新可跳跃范围

全局最优解:最后得到整体的最大可跳跃范围,看看能不能到终点

代码

  1. class Solution {
  2. public:
  3. bool canJump(vector<int>& nums) {
  4. if(nums.size() == 1) return true;//只有一个数时默认可以跳一步,直接返回true
  5. int jumpScope = 0;//定义变量表示当前可以跳的范围
  6. for(int i = 0; i <= jumpScope; ++i){//在可跳跃范围内遍历,找新的数取扩充这个范围
  7. //在当前遍历值表示的跳跃范围内继续遍历找新的值来更新覆盖范围,取最大的值
  8. jumpScope = max(i + nums[i], jumpScope);//注意,jumpScope表示的是下标
  9. if(jumpScope >= nums.size() - 1) return true;
  10. }
  11. return false;
  12. }
  13. };

跳跃游戏II

力扣题目链接(opens new window)

给定一个非负整数数组,你最初位于数组的第一个位置。

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

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

示例:

  • 输入: [2,3,1,1,4]
  • 输出: 2
  • 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

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

思路

这里就不太一样了,我们还需要考虑怎么跳,跳跃次数最少

具体做法是,在当前值的遍历范围内遍历,每次的遍历结果保存到一个变量中(总保存当前最大的),这个变量是下次跳跃的范围

举个例子:

遍历开始时,初始跳跃范围是[2](默认有一步,这就是为什么如果只有一个元素的话直接返回true

遍历[2],记录2为下次跳跃范围,发现默认给的一步到不了数组的末尾,好的,使用当前记录的2作为下次跳跃的范围

此时,跳跃范围第一次扩展到[2,3,1],当前的遍历下标走到3,更新下次跳跃范围为3(因为3比之前的2大)

记录跳跃次数res = 1。

继续遍历,遍历到1, 1小于3所以此时不用更新下次跳跃范围

好了,第一次拓展的跳跃范围([2,3,1])已经遍历完毕,此时仍未达到数组末尾,因此需要再次拓展遍历范围,使用记录的最大的下次跳跃范围进行拓展(即3)

第二次扩展跳跃范围到[3, 1, 1, 4],和上面一样,开始遍历这个新的范围,并从中寻找最大值作为下一次跳跃的范围

记录跳跃次数res = 2。

但是这次把跳跃范围遍历完之后,发现到数组末尾了,所以可以直接结束

从上面的过程可以发现,只有在当前跳跃范围不足时我们才会去扩展跳跃范围,且扩展时是以当前范围中的最大值为依据进行的

每扩展一次就相当于进行了一次跳跃,只不过这次跳跃是最优的跳跃(因为选择了最大值)

这里的贪心思想是:

局部最优--找到当前跳跃区间内的最大值作为下次跳跃的区间

全局最优--总使用最大的值作为跳跃区间,进而达到以最少的跳跃次数到达数组末尾的目的

代码

主要思路和前一题差不多,区别在于需要记录下一次跳跃使用的范围以及跳跃次数

步骤:

1、判断是否只有一个元素,是就直接返回0

2、定义变量,用于保存下次/当前跳跃区间跳跃次数

3、遍历数组(注意和上体的区别,上题是只遍历当前跳跃范围),不断寻找更大的值来更新nextJumpscope

4、判断当前跳跃区间是否遍历完成

  • 如果遍历完了,判断是否到数组末尾

    • 到了就结束break
    • 没到就记录跳跃次数,并将当前跳跃区间curJumpscope更新为下次跳跃区间nextJumpscope(并判断nextJumpscope是否超出数组长度,超出也可直接结束)
  1. class Solution {
  2. public:
  3. int jump(vector<int>& nums) {
  4. //如果数组只有一个元素,直接返回
  5. if(nums.size() == 1) return 0;
  6. //定义变量保存下次/当前跳跃区间、跳跃次数
  7. int nextJumpscope = 0;//下次跳跃的区间值
  8. int curJumpscope = 0;//当前跳跃的区间值
  9. int jumpCount = 0;//跳跃次数记录
  10. for(int i = 0; i < nums.size(); ++i){//遍历数组(在curJumpscope范围内)
  11. //不断寻找更大的值来更新nextJumpscope
  12. nextJumpscope = max(i + nums[i], nextJumpscope);
  13. if(i == curJumpscope){//如果当前区间遍历完了,就使用nextJumpscope作为跳跃值进行下一次跳跃
  14. if(curJumpscope != nums.size() - 1){//如果当前区间遍历完都没到数组末尾,那么需要跳跃到新的区间
  15. jumpCount++;
  16. curJumpscope = nextJumpscope;
  17. if(nextJumpscope >= nums.size() - 1) break;//如果下次更新的跳跃区域大于数组长度,直接结束
  18. }else break;////如果当前区间遍历完已经到数组末尾,结束
  19. }
  20. }
  21. return jumpCount;
  22. }
  23. };

【LeetCode贪心#04】跳跃游戏I + II的更多相关文章

  1. Leetcode题目55.跳跃游戏(贪心算法-中等)

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

  2. 贪心——55. 跳跃游戏 && 45.跳跃游戏II

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

  3. [LeetCode] Jump Game 跳跃游戏

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

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

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

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

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

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

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

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

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

  8. [LeetCode] 45. Jump Game II 跳跃游戏 II

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

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

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

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

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

随机推荐

  1. [转帖]Linux中的Page cache和Buffer cache详解

    1.内存情况 在讲解Linux内存管理时已经提到,当你在Linux下频繁存取文件后,即使系统上没有运行许多程序,也会占用大量的物理内存.这是因为当你读写文件的时候,Linux内核为了提高读写的性能和速 ...

  2. gcore的学习

    gcore的学习-解决jmap无法生成dump文件的一种方法 背景 周末在跆拳道馆看孩子练跆拳道. 开着笔记本翻到了 扣钉日记 公众号里面的讲解 想着自己也遇到过无法保存dump文件的情况. 所以想学 ...

  3. [转帖]Mars II - Microarchitectures - Phytium

    https://en.wikichip.org/wiki/phytium/microarchitectures/mars_ii Edit Values Mars II µarch General In ...

  4. JVM启动参数脚本的再学习与研究

    JVM启动参数脚本的再学习与研究 摘要 学无止境 前段时间一直再研究JVM参数调优. 但是最近也在想不应该仅研究如何调优. 因为不管怎么设置, 总有猪队友会把环境搞崩. 所以应该想办法在无人值守的情况 ...

  5. Windows 审计日志 安全部分不刷新的解决办法

    现在存在一个问题如图示: 有接近15个小时的日志没有进行记录和展示. 要追查问题比较麻烦. 后来发现必须要手动刷新一下 审计记录才可以实现. 感觉比较奇怪 位置为  计算机配置->windows ...

  6. 【发现一个问题】extjs-gpl-7.0: 当修改 store 对象的字段后,再次 loadPage() 后字段映射错误。

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为查询中需要每次返回数目不确定的 fields ,这就需 ...

  7. P7036 [NWRRC2016] Folding

    题目简述 有两个矩形,大小分别是 \(W \times Y\) 和 $ w \times y$.现在我们要通过折叠将两个矩阵变成一样. 思路 part1 已知一条边折叠一次会变成 \(\frac{x} ...

  8. 为mac搭建开发环境的笔记

    公司的游戏项目需要出ios包上架到app store,由我负责接入ios的sdk,这里记录一下为mac搭建开发环境的笔记,大多是软件和编程习惯相关的内容. 常用软件 解压缩软件:bandizip在ma ...

  9. PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

     相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨: ...

  10. node版本控制工具nvm安装教程

    一.安装nvm 查看node对应NPM:https://nodejs.org/en/about/previous-releases 1.卸载node,后删除node文件夹里的所有内容 2:安装nvm管 ...