【问题描述】[Leedcode][JAVA][第45题][跳跃游戏 II]

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

【解答思路】

1. 动态规划 超时

第 1 步:设计状态 int[] temp = new int[len];
第 2 步:状态转移方程

  • 没跳过 temp[j]=temp[i]+1
  • 跳过 temp[j] = Math.min( temp[j],temp[i]+1 );
    第 3 步:考虑初始化
    temp数组置0 第一跳
    第 4 步:考虑输出
    temp[len-1]
    时间复杂度:O(N^2) 空间复杂度:O(N)
 public int jump(int[] nums) {int len =  nums.length;if(len ==  0 ||len ==1){return 0;}int[] temp = new int[len];//辅助数组置0for(int i =0; i<len ;i++){temp[i] = 0;}//初始化第一跳for(int i =1; (i<=nums[0]) && (i<len);i++){temp[i]++;}//动态规划for(int i =1; i<len-1 ;i++){//注意边界for(int j=i+1; (j<=nums[i]+i)&& (j<=len-1);j++){//跳过 比较当前到达j位所在步数 与  起跳格i所在步数+1 之间的大小if(temp[i]+1 < temp[j]){temp[j]=temp[i]+1 ;}//没跳过 则是起跳格i所在步数+1if(temp[j]==0){temp[j]=temp[i]+1;}}}return temp[len-1];}
2. 反向查找位置 贪心
  • 「贪心」地选择距离最后一个位置最远的那个位置,也就是对应下标最小的那个位置。
  • 从左到右遍历数组,选择第一个满足要求的位置。
    时间复杂度:O(N^2) 空间复杂度:O(1)
public int jump(int[] nums) {int position = nums.length - 1;int steps = 0;while (position > 0) {for (int i = 0; i < position; i++) {if (i + nums[i] >= position) {position = i;steps++;break;}}}return steps;}
3. 正向查找可到达的最大位置 降低时间复杂度

时间复杂度:O(N) 空间复杂度:O(1)

public int jump(int[] nums) {int end = 0;int maxPosition = 0; int steps = 0;for(int i = 0; i < nums.length - 1; i++){//找能跳的最远的maxPosition = Math.max(maxPosition, nums[i] + i); if( i == end){ //遇到边界,就更新边界,并且步数加一end = maxPosition;steps++;}}return steps;
}

【总结】

1.贪心算法,每次找局部最优,最后达到全局最优
2. 不要死板 想好方法 总有办法实现 巧妙更新边界
3. 画图思考 想清楚再动手

参考链接:https://leetcode-cn.com/problems/jump-game-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-10/

[Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]相关推荐

  1. [Leedcode][JAVA][第56题][合并区间][数组][贪心算法]

    [问题描述]56.合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18] ...

  2. [Leedcode][JAVA][第55题][跳跃游戏][贪心][动态规划]

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

  3. 162. Leetcode 45. 跳跃游戏 II (贪心算法-贪心区间)

    class Solution:def jump(self, nums: List[int]) -> int:if len(nums) == 1:return 0# 记录走的最大步数.当前覆盖最远 ...

  4. Leetcode 45:跳跃游戏 II(最详细的解法!!!)

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

  5. [Leedcode][JAVA][第289题][生命游戏]

    [问题描述] 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机.给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞都具 ...

  6. 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法

    [LeetCode]LeetCode之打家劫舍[暴力递归.动态规划.动态规划之优化空间的具体分析与实现] https://blog.csdn.net/Kevinnsm/article/details/ ...

  7. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  8. 45. 跳跃游戏 II golang 动态规划

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

  9. 2022.3.4总结+45. 跳跃游戏 II 力扣

    是二月二,龙抬头 在我们那儿有吃拉面的习惯,不过每天要保持学习哦! 跳跃游戏 II 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. ...

最新文章

  1. python汉明距离检索_Python中的汉明距离
  2. 构造一个日期类java_Java8 新日期时间类(1)
  3. 【转】VS问题集合,不用也要收藏防止以后使用找不到
  4. java 打包后 文件资源文件 jar,JAVA打包成JAR无法找到资源文件
  5. THINKPHP3文件缓存管理
  6. xcode 左边导航栏中,类文件后面的标记“A”,M,?……等符号的含义???(转)...
  7. 条码打印软件如何添加新字体
  8. ruoyi 项目启动步骤
  9. 在中关村创业大街Binggo这半年
  10. 计算机电源大小怎么看,怎么看电脑电源多少w
  11. 什么是路由器的光模块-华为路由器
  12. H 小P的数学问题(分块)
  13. itoa函数和atoi函数的实现和用法
  14. 7月5号cf服务器维护,cf2015年5月7日维护到几点 cf5月7日更新公告
  15. 深度学习的权重衰减是什么_权重衰减和L2正则化是一个意思吗?它们只是在某些条件下等价...
  16. intersect 相交 范围_Intersect(相交)
  17. 自己试用期还没过就开始带实习生是什么鬼?
  18. 解决“Spark context stopped while waiting for backend“ issue
  19. Spring Boot web开发(未完待续)
  20. 抛弃腾讯,特斯拉马斯克选择百度地图

热门文章

  1. 学不会的JAVA,消不了的忧愁! 1
  2. 三全食品:信息化建设狂飙突进的六年
  3. oracle闪回特性,oracle闪回特性
  4. 不知道密码导出oracle数据库,Oracle数据库密码重置、导入导出库命令示例应用
  5. jqgrid删除某一列(隐藏)
  6. vue-cli webpack 打包报错:Unexpected token: punc (()
  7. ubuntu man手册完善
  8. 测试常用工具下载地址,LR11、QC11
  9. Ant Design Pro 修改title
  10. 会移动的文字(Marquee)