20200224:跳跃游戏(leetcode55)
跳跃游戏
- 题目
- 思路与算法
- 代码实现
- 复杂度分析
题目
思路与算法
回溯写法
回溯写法加一个简单的性质判断
对此性质判断的再优化
最终版:贪心
1-3的做法总体上思路是有些多余的:1甚至会TLE,2-3的时间复杂度在O(N²),但对于理解回溯有很大帮助。
主要说一下贪心的思路:注意题目中说的当前节点的值是你能跳跃到达的最远节点,意思就是当前节点若可以到达末尾,那么前面的任何一个可以到达当前节点的节点都可以到达末尾,综上,我们从倒数第二个数出发(末尾数一定可以到达自己),找到当前数字是否可以到达末尾,若可以,则维护一个索引最小的可以到达末尾的变量,可以到达这个变量,即不用再继续遍历,以此来写,达到最优时间空间复杂度O(N)。
代码实现
方法一
package com.immunize.leetcode.canJump;/*** 方法一:TLE* * @author Mr IMMUNIZE**/
public class Solution {private boolean canJumpPos(int pos, int[] nums) {// 特殊情况处理if (pos == nums.length - 1) {return true;}// 计算当前pos的最远跳跃距离int fur_dst = Math.min(nums.length - 1, pos + nums[pos]);// 递归遍历进行判断即可for (int nextPos = pos + 1; nextPos <= fur_dst; nextPos++) {if (canJumpPos(nextPos, nums)) {return true;}}return false;}public boolean canJump(int[] nums) {return canJumpPos(0, nums);}
}
方法二
package com.immunize.leetcode.canJump;//可以到达末尾,则为Good节点,否则为Bad,尚未确定为Unknown
enum Index {Good, Bad, Unknown;
}/*** 第一个方法的优化版,加上了每个节点的性质判断* * @author Mr IMMUNIZE**/
public class Solution2 {Index[] memo;public boolean canJumpPos(int pos, int[] nums) {// 特殊情况处理if (memo[pos] != Index.Unknown) {return memo[pos] == Index.Good ? true : false;}// 初始化变量:计算最远跳跃距离,存储节点性质的数组int fur_dst = Math.min(nums.length - 1, pos + nums[pos]);// 回溯时判断当前节点是否可以到达末尾for (int nextPos = pos + 1; nextPos <= fur_dst; nextPos++) {if (canJumpPos(nextPos, nums)) {memo[nextPos] = Index.Good;return true;}}memo[pos] = Index.Bad;return false;}public boolean canJump(int[] nums) {// 注意此处创建的是其长度memo = new Index[nums.length];// 除了最后一个节点为Good,其余先设置为Unknownfor (int i = 0; i < nums.length; i++) {memo[i] = Index.Unknown;if (i == nums.length - 1) {memo[i] = Index.Good;}}return canJumpPos(0, nums);}}
方法三
package com.immunize.leetcode.canJump;enum Index {Good, Bad, Unknown;
}public class Solution3 {public boolean canJump(int[] nums) {// 存储当前节点性质的memo数组,并定义nums数组的所有节点性质Index[] memo = new Index[nums.length];for (int i = 0; i < nums.length; i++) {memo[i] = Index.Unknown;if (i == nums.length - 1) {memo[i] = Index.Good;}}// 每次对比当前节点可遍历范围内的节点即可,后面的节点为Good,则当前节点一定为Goodfor (int j = nums.length - 2; j >= 0; j--) {// 计算当前节点的可跳跃范围int fur_dst = Math.min(nums.length - 1, nums[j] + j);// 与之跳跃范围内的所有右边的数比较,如果范围内有Good点,则当前节点为Good,for (int k = j + 1; k <= fur_dst; k++) {if (memo[k] == Index.Good) {memo[j] = Index.Good;// 记得跳出内层循环break;}}}return memo[0] == Index.Good ? true : false;}
}
方法四:贪心
package com.immunize.leetcode.canJump;public class Solution4 {public boolean canJump(int[] nums) {int lastPos = nums.length - 1;for (int i = nums.length - 1; i >= 0; i--) {if (i + nums[i] >= lastPos) {lastPos = i;}}return lastPos == 0;}
}
复杂度分析
时间复杂度
方法一(不加性质判断的回溯):O(2^N)
方法二&三:(增加性质判断的回溯) :O(N²)
方法四(贪心):O(N)
20200224:跳跃游戏(leetcode55)相关推荐
- 跳跃游戏—leetcode55
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...
- LeetCode-55. 跳跃游戏
LeetCode-55. 跳跃游戏 (中等) 题目地址:https://leetcode-cn.com/problems/jump-game/ 文章目录 LeetCode-55. 跳跃游戏 (中等) ...
- LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)
LeetCode55跳跃游戏//力扣55跳跃游戏(贪心) 来源:力扣(LeetCode) 链接:题目跳转 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该 ...
- LeetCode-55、跳跃游戏-中等
LeetCode-55.跳跃游戏-中等 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [ ...
- LeetCode--55.跳跃游戏(贪心,零点跳跃)
跳跃游戏(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 零点跳跃法 3.2 贪心算法 1. 题目描述 难度:中等 2. 题目分析 这道题很有意思,我们需要知道的有这么几点: 如果输入 ...
- leetcode-45 跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...
- LeetCode--45. 跳跃游戏Ⅱ(贪心)
跳跃游戏Ⅱ(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 最大跨越点算法 3.2 贪心算法 1. 题目描述 难度:困难 2. 题目分析 该题目是LeetCode55.跳跃算法的进阶版 ...
- 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)
一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...
- 跳跃游戏 (贪心/动态规划/dfs)
1.跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr[],从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到 ...
最新文章
- 【SVN多用户开发】代码冲突解决办法
- adf盖怎么打开_打印机墨盒怎么更换,看我这篇文章就够了
- 其他算法-Dijkstra
- centos7安装redmine3.4
- 评价算法的性能从利用计算机资源角度,计算机专业数据结构课后练习题汇编
- Asp.net控件开发学习笔记(六)----数据回传
- 16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat
- 中英文对照 —— 饮食与美食
- Mac文件系统下的chmod修改权限r w x分别是什么意思
- r语言导出文件为xlxs_【软件】R语言数据导入与导出
- 使用 Visual Studio 创建 .NET 控制台应用程序
- 安卓版teamview15.5.3
- 3D图库框架范围与示例
- 华为云从入门到实战 | 云速建站服务与企业主机安全服务
- AI绘图之基于文本/图片制图
- python什么字体好看_python docx 中文字体设置的操作方法
- 华为交换机配置consol密码及vty密码
- 案例 | 巴别鸟助推WE+管理入驻企业文档资料
- 现货跟期货有什么区别(现货和期货交易区别)
- Python抓取网页云音乐指定歌手的歌曲和评论数量
热门文章
- “一百万行 Python 代码对任何人都足够了”!
- 用Scala实现简单的Web和API服务器
- @广州开发者,华为送来一份说明书——助你轻松应对开发难题
- 所有的 iPhone 和高端 Android 设备都被破解了!
- Swift 势必取代 Python?
- @程序员,你的 996,可能是给公司无能的管理背锅
- 辽宁职称计算机和英语考试,2018年辽宁职称计算机报考有哪些要求?
- mysql 关键字搜索 排名_mysql 的 查找 与 排序
- 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...
- 创建ajax及用法,Ajax的简单使用