目录

  • 跳跃游戏(jump-game)
    • 思路
    • 代码
  • 跳跃游戏II (jump-game-ii)
    • 思路(正向查找可到达的最大位置)
  • 资料

跳跃游戏(jump-game)

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

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

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

示例 1:

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

示例 2:

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

思路

从第 i 位置最远可以跳 nums[ i ] 步。
比如[2,3,1,1,4]
从0位置,最远可以跳两步;
从1位置,最远可以跳三步;
从2位置,最远可以跳一步;
从3位置,最远可以跳一步;

这样子无法直接看出规律,我们把最远跳多少步转化为可以跳跃到的位置

我们把数组竖起来看一下规律。

数组 位置 1 2 3 4 5 6 7 8
2 0 O O
3 1 O O O
1 2 O
1 3 O
4 4 O O O O

从上面的表格可以看出
从第0位置,可以跳跃第1位置或第2位置;
从第1位置,可以跳跃第2、第3、第4位置;
从第2位置,可以跳跃第3位置;
从第3位置,可以跳跃第4位置;

所以,发现规律,从第 i 位置,最远可以跳至第 index[ i ] 位置。
i + nums[ i ] = index[ i ]。

思考,为什么只记录当前位置可以最远可以跳的位置,并把它们保存为一维数组,不用记录当前位置最近可以跳跃的位置吗?

代码

#include <stdio.h>#include <vector>
class Solution {public:bool canJump(std::vector<int>& nums) {std::vector<int> index; //最远可跳至的位置for (int i = 0; i < nums.size(); i++){index.push_back(i + nums[i]);//计算index数组}int jump = 0; //jump指针int max_index = index[0]; //最远可以跳到的位置while(jump < index.size() && jump <= max_index){if (max_index < index[jump]){max_index = index[jump]; //如果可以跳得更远,则更新max_index}jump++; //扫描jump}if (jump == index.size()){ //若jump到达数组尾部则返回真return true;}return false; //否则返回假}
};int main(){std::vector<int> nums;nums.push_back(2);nums.push_back(3);nums.push_back(1);nums.push_back(1);nums.push_back(4);Solution solve;printf("%d\n", solve.canJump(nums));return 0;
}

java

public class Solution {public boolean canJump(int[] nums) {int n = nums.length;int rightmost = 0;for (int i = 0; i < n; ++i) {if (i <= rightmost) {rightmost = Math.max(rightmost, i + nums[i]);if (rightmost >= n - 1) {return true;}}}return false;}
}

python3

class Solution:def canJump(self, nums: List[int]) -> bool:n, rightmost = len(nums), 0for i in range(n):if i <= rightmost:rightmost = max(rightmost, i + nums[i])if rightmost >= n - 1:return Truereturn False

跳跃游戏II (jump-game-ii)

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

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

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

示例:

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

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

思路(正向查找可到达的最大位置)

在具体的实现中,我们维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 1。

在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次「不必要的跳跃次数」,因此我们不必访问最后一个元素。

class Solution {public int jump(int[] nums) {int length = nums.length;int end = 0;//--------------边界int maxPosition = 0; //-----能跳到的最大下标位置int steps = 0;for (int i = 0; i < length - 1; i++) {maxPosition = Math.max(maxPosition, i + nums[i]); if (i == end) {end = maxPosition;steps++;}}return steps;}
}

资料

参考leetcode-cn。

跳跃游戏(jump-game)图解相关推荐

  1. LeetCode—55.跳跃游戏(Jump Game)——分析及代码(C++)

    LeetCode-55.跳跃游戏[Jump Game]--分析及代码[C++] 一.题目 二.分析及代码 1. 贪心 (1)思路 (2)代码(简洁) (3)代码(高效) (4)结果 三.其他 一.题目 ...

  2. 116 · 跳跃游戏 Jump Game

    116 · 跳跃游戏 Jump Game 描述 Given an array of non-negative integers, you are initially positioned at the ...

  3. LeetCode 55 -- 跳跃游戏 ( Jump Game ) ( C语言版 )

    题目描述 :  解题思路 : 本题目不能一开始从最大长度进行跳跃 , 应该一次次遍历每个数组元素 , 采用贪心法 , max表示每次能够到达的最远距离 , 使用max=max<i+nums[i] ...

  4. 跳跃游戏 Jump Game 分析与整理

    参考文章 点这儿查看 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以向后跳跃的最大长度. 问题一 判断你能不能到达数组的最后一个位置. 思路:从数组的第一个位置开 ...

  5. 运用贪心思想解决跳跃游戏

    运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...

  6. JavaScript实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)

    JavaScript实现backtracking Jump Game回溯跳跃游戏算法(附完整源码) backtrackingJumpGame.js完整源代码 backtrackingJumpGame. ...

  7. 55.跳跃游戏(Jump Game)

    我的GitHub,欢迎捧场:https://github.com/FuGaZn/LeetCode 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的 ...

  8. C++jump game跳跃游戏的算法(附完整源码)

    C++jump game跳跃游戏的算法 C++实现jump game跳跃游戏的算法完整源码(定义,实现,main函数测试) C++实现jump game跳跃游戏的算法完整源码(定义,实现,main函数 ...

  9. LeetCode——1871. 跳跃游戏 VII(Jump Game VII)[中等]——分析及代码(Java)

    LeetCode--1871. 跳跃游戏 VII[Jump Game VII][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 + 队列 (1)思路 (2)代码 (3)结果 ...

最新文章

  1. 图像处理之基础---极坐标系及其与直角坐标系的关系
  2. java web 利用ajax 异步向后台提交数据
  3. on条件与where条件的区别
  4. AC日记——计算多项式的导函数 openjudge 1.5 38
  5. CodeForces - 1550E Stringforces(二分+状压dp)
  6. 剖析大数据平台的数据采集
  7. js日期控件_11个开源的Github开源日期选择器组件,供你选择
  8. ios html gif 显示,iOS gif图显示问题
  9. 35. 内容协商和转码
  10. 编译安装汇总:nVidia驱动/CUDA/cuDNN/TensorRT/OpenCV/gstreamer/DeepStream/jpeglib等
  11. 如何用BabeLua运行Lua代码
  12. c语言ax2bxc0的求根公式,ax2+bx+c=0的求根公式
  13. 开心网程炳皓:早期创业公司应该做一根针
  14. 360随身wifi2驱动 v5.3.0.1035 官方版
  15. 手机4k屏幕测试软件,索尼Z5 Premium 4K屏幕测试:1080p屏是王道!
  16. 计算机提示无法验证发布者,win7系统取消“无法验证发布者”提示框的操作技巧...
  17. mysql重启后数据库消失_linux重启后mysql数据库文件全部丢失mysql无法启动
  18. 【oracle】oracle创建表、创建索引、创建自增id
  19. 广州欧米区块链科技×浙江墨客奇迹区块链科技丨达成战略合作共识
  20. 深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...

热门文章

  1. AH463全极高灵敏低功耗霍尔开关
  2. win7忘记密码怎么办,Administrator忘记密码解决办法【完美、简单、有效】
  3. microsoft outlook “未读邮件”收藏夹被误删
  4. 多种进制转换方法,原码、反码、补码计算与转换,位运算符的使用方法,函数简介
  5. 什么是静态网站?什么是动态网站?
  6. 人工智能与图像处理在机器人视觉中的应用
  7. UWB实现手榴弹投掷训练保护装置
  8. mysql的slow_log表_【转载】mysql 开启慢查询 清空slow_log日志或者slow_log表
  9. ecg去噪 matlab,基于matlab对ECG信号进行滤波处理
  10. 机器学习之支持向量机(SVM)学习笔记-Datawhale Task05