跳跃游戏

  • 题目
  • 思路与算法
  • 代码实现
  • 复杂度分析

题目

思路与算法

  1. 回溯写法

  2. 回溯写法加一个简单的性质判断

  3. 对此性质判断的再优化

  4. 最终版:贪心

    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)相关推荐

  1. 跳跃游戏—leetcode55

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

  2. LeetCode-55. 跳跃游戏

    LeetCode-55. 跳跃游戏 (中等) 题目地址:https://leetcode-cn.com/problems/jump-game/ 文章目录 LeetCode-55. 跳跃游戏 (中等) ...

  3. LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)

    LeetCode55跳跃游戏//力扣55跳跃游戏(贪心) 来源:力扣(LeetCode) 链接:题目跳转 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该 ...

  4. LeetCode-55、跳跃游戏-中等

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

  5. LeetCode--55.跳跃游戏(贪心,零点跳跃)

    跳跃游戏(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 零点跳跃法 3.2 贪心算法 1. 题目描述 难度:中等 2. 题目分析 这道题很有意思,我们需要知道的有这么几点: 如果输入 ...

  6. leetcode-45 跳跃游戏II

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

  7. LeetCode--45. 跳跃游戏Ⅱ(贪心)

    跳跃游戏Ⅱ(C) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 最大跨越点算法 3.2 贪心算法 1. 题目描述 难度:困难 2. 题目分析 该题目是LeetCode55.跳跃算法的进阶版 ...

  8. 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)

    一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...

  9. 跳跃游戏 (贪心/动态规划/dfs)

    1.跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr[],从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步,或者固定步数,直到到 ...

最新文章

  1. 【SVN多用户开发】代码冲突解决办法
  2. adf盖怎么打开_打印机墨盒怎么更换,看我这篇文章就够了
  3. 其他算法-Dijkstra
  4. centos7安装redmine3.4
  5. 评价算法的性能从利用计算机资源角度,计算机专业数据结构课后练习题汇编
  6. Asp.net控件开发学习笔记(六)----数据回传
  7. 16.1 Tomcat介绍16.2 安装jdk16.3 安装Tomcat
  8. 中英文对照 —— 饮食与美食
  9. Mac文件系统下的chmod修改权限r w x分别是什么意思
  10. r语言导出文件为xlxs_【软件】R语言数据导入与导出
  11. 使用 Visual Studio 创建 .NET 控制台应用程序
  12. 安卓版teamview15.5.3
  13. 3D图库框架范围与示例
  14. 华为云从入门到实战 | 云速建站服务与企业主机安全服务
  15. AI绘图之基于文本/图片制图
  16. python什么字体好看_python docx 中文字体设置的操作方法
  17. 华为交换机配置consol密码及vty密码
  18. 案例 | 巴别鸟助推WE+管理入驻企业文档资料
  19. 现货跟期货有什么区别(现货和期货交易区别)
  20. Python抓取网页云音乐指定歌手的歌曲和评论数量

热门文章

  1. “一百万行 Python 代码对任何人都足够了”!
  2. 用Scala实现简单的Web和API服务器
  3. @广州开发者,华为送来一份说明书——助你轻松应对开发难题
  4. 所有的 iPhone 和高端 Android 设备都被破解了!
  5. Swift 势必取代 Python?
  6. @程序员,你的 996,可能是给公司无能的管理背锅
  7. 辽宁职称计算机和英语考试,2018年辽宁职称计算机报考有哪些要求?
  8. mysql 关键字搜索 排名_mysql 的 查找 与 排序
  9. 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...
  10. 创建ajax及用法,Ajax的简单使用