跳跃游戏(jump-game)图解
目录
- 跳跃游戏(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)图解相关推荐
- LeetCode—55.跳跃游戏(Jump Game)——分析及代码(C++)
LeetCode-55.跳跃游戏[Jump Game]--分析及代码[C++] 一.题目 二.分析及代码 1. 贪心 (1)思路 (2)代码(简洁) (3)代码(高效) (4)结果 三.其他 一.题目 ...
- 116 · 跳跃游戏 Jump Game
116 · 跳跃游戏 Jump Game 描述 Given an array of non-negative integers, you are initially positioned at the ...
- LeetCode 55 -- 跳跃游戏 ( Jump Game ) ( C语言版 )
题目描述 : 解题思路 : 本题目不能一开始从最大长度进行跳跃 , 应该一次次遍历每个数组元素 , 采用贪心法 , max表示每次能够到达的最远距离 , 使用max=max<i+nums[i] ...
- 跳跃游戏 Jump Game 分析与整理
参考文章 点这儿查看 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以向后跳跃的最大长度. 问题一 判断你能不能到达数组的最后一个位置. 思路:从数组的第一个位置开 ...
- 运用贪心思想解决跳跃游戏
运用贪心思想解决跳跃游戏 文章目录 运用贪心思想解决跳跃游戏 Jump Game I 1.题目描述 2.分析 3.代码 Jump Game II 1.问题描述 2.分析 3.动规代码[超时] 4.贪心 ...
- JavaScript实现backtracking Jump Game回溯跳跃游戏算法(附完整源码)
JavaScript实现backtracking Jump Game回溯跳跃游戏算法(附完整源码) backtrackingJumpGame.js完整源代码 backtrackingJumpGame. ...
- 55.跳跃游戏(Jump Game)
我的GitHub,欢迎捧场:https://github.com/FuGaZn/LeetCode 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的 ...
- C++jump game跳跃游戏的算法(附完整源码)
C++jump game跳跃游戏的算法 C++实现jump game跳跃游戏的算法完整源码(定义,实现,main函数测试) C++实现jump game跳跃游戏的算法完整源码(定义,实现,main函数 ...
- LeetCode——1871. 跳跃游戏 VII(Jump Game VII)[中等]——分析及代码(Java)
LeetCode--1871. 跳跃游戏 VII[Jump Game VII][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 + 队列 (1)思路 (2)代码 (3)结果 ...
最新文章
- 图像处理之基础---极坐标系及其与直角坐标系的关系
- java web 利用ajax 异步向后台提交数据
- on条件与where条件的区别
- AC日记——计算多项式的导函数 openjudge 1.5 38
- CodeForces - 1550E Stringforces(二分+状压dp)
- 剖析大数据平台的数据采集
- js日期控件_11个开源的Github开源日期选择器组件,供你选择
- ios html gif 显示,iOS gif图显示问题
- 35. 内容协商和转码
- 编译安装汇总:nVidia驱动/CUDA/cuDNN/TensorRT/OpenCV/gstreamer/DeepStream/jpeglib等
- 如何用BabeLua运行Lua代码
- c语言ax2bxc0的求根公式,ax2+bx+c=0的求根公式
- 开心网程炳皓:早期创业公司应该做一根针
- 360随身wifi2驱动 v5.3.0.1035 官方版
- 手机4k屏幕测试软件,索尼Z5 Premium 4K屏幕测试:1080p屏是王道!
- 计算机提示无法验证发布者,win7系统取消“无法验证发布者”提示框的操作技巧...
- mysql重启后数据库消失_linux重启后mysql数据库文件全部丢失mysql无法启动
- 【oracle】oracle创建表、创建索引、创建自增id
- 广州欧米区块链科技×浙江墨客奇迹区块链科技丨达成战略合作共识
- 深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...
热门文章
- AH463全极高灵敏低功耗霍尔开关
- win7忘记密码怎么办,Administrator忘记密码解决办法【完美、简单、有效】
- microsoft outlook “未读邮件”收藏夹被误删
- 多种进制转换方法,原码、反码、补码计算与转换,位运算符的使用方法,函数简介
- 什么是静态网站?什么是动态网站?
- 人工智能与图像处理在机器人视觉中的应用
- UWB实现手榴弹投掷训练保护装置
- mysql的slow_log表_【转载】mysql 开启慢查询 清空slow_log日志或者slow_log表
- ecg去噪 matlab,基于matlab对ECG信号进行滤波处理
- 机器学习之支持向量机(SVM)学习笔记-Datawhale Task05