JAVA算法:Jump Game 45题和55题算法详解

2023-11-10 14:08
文章标签 java 算法 详解 45 game jump

本文主要是介绍JAVA算法:Jump Game 45题和55题算法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在LeetCode中45题和55题是关于Jump Game的问题,下面来看看这两道题目的求解方法。

这两个题目的区别是:55题的要求判断你是否能够从开始位置跳到结束位置;而45题的要求是求你从开始位置能够跳到结束位置的最小跳跃次数。。

原题链接:

55. Jump Game https://leetcode.com/problems/jump-game/

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
             jump length is 0, which makes it impossible to reach the last index.

45. Jump Game II https://leetcode.com/problems/jump-game-ii/

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

Example:

Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
    Jump 1 step from index 0 to 1, then 3 steps to the last index.
Note:

You can assume that you can always reach the last index.

 

问题求解:从起始位置能够跳跃到最后的终止位置

算法分析:回溯算法(Backtracking)

采用回溯算法(Backtracking),这是一个效率低下的解决方案。
思路:

尝试从第一个位置到最后一个位置的每一个跳跃模式。
从第一个位置开始,跳到所有可以到达的索引。 
重复这个过程,直到到达最后一个索引。 
卡住时,回退。

算法设计:

    /** 从index为0的位置开始起跳* */public boolean canJump(int[] nums) {return canJumpFromPosition(0, nums);}/** 采用回溯算法(Backtracking),这是一个效率低下的解决方案。* 思路:* 尝试从第一个位置到最后一个位置的每一个跳跃模式。* 从第一个位置开始,跳到所有可以到达的索引。 * 重复这个过程,直到到达最后一个索引。 * 卡住时,回退。*/public boolean canJumpFromPosition(int position, int[] nums) {//如果到达结束位置,则返回trueif (position == nums.length - 1) {return true;}int furthestJump = Math.min(position + nums[position], nums.length - 1);for (int nextPosition = position + 1; nextPosition <= furthestJump; nextPosition++) {if (canJumpFromPosition(nextPosition, nums)) {return true;}}return false;}

这个算法虽然可以得到正确的结果,但是在LeetCode上提交时超时!

算法设计:贪心算法(Greedy)

    /** 贪心算法(Greedy)* */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;System.out.println("lastPos = " + lastPos);}}return lastPos == 0;}

提交之后,Accepted!

算法设计:贪心算法(Greedy)设计

维护一个当前能跳到的最大值maxJump, 
若是maxJump 已经>=nums.length-1, 说明能跳到最后一个点,return true.
若是过程中maxJump <= i, 说明跳到当前点便不能往前,跳出loop, return false.

    /** 贪心算法* 维护一个当前能跳到的最大值maxJump, * 若是maxJump 已经>=nums.length-1, * 说明能跳到最后一个点,return true.* 若是过程中maxJump <= i, * 说明跳到当前点便不能往前,跳出loop, return false.* */public boolean canJump(int[] nums) {int n = nums.length;// maxJump是维护的当前能跳到的最大位置int maxJump = 0;// for (int i = 0; i < n && i <= maxJump; ++i)// maxJump = Math.max(nums[i] + i, maxJump);for (int i = 0; i < n; i++) {// i>maxJump表示无法到达i的位置,失败// maxJump >= (n - 1),此时的距离已经足够到达终点,成功if (i > maxJump || maxJump >= (n - 1))break;// nums[i]+i当前跳最远距离 maxJump为i之前跳最远距离maxJump = Math.max(maxJump, i + nums[i]);}return maxJump >= (n - 1);}

算法设计:动态规划(DP)

每次跳跃选择往最远处跳跃,如果最后能够跳到数组最后一位或者最后一位之后,

那么一定存在一种跳跃方式正好跳到最后一位上。

	/** 每次跳跃选择往最远处跳跃,如果最后能够跳到数组最后一位或者最后一位之后,* 那么一定存在一种跳跃方式正好跳到最后一位上* *//** 动态规划* */public boolean canJump(int[] nums) {int n = nums.length;// dp[i]表示当前跳跃的最大距离int dp[] = new int[n];dp[0] = nums[0];// i表示当前距离,也是下标for (int i = 1; i < n; i++) {// i点可达if (i <= dp[i - 1])dp[i] = Math.max(dp[i - 1], i + nums[i]);elsedp[i] = dp[i - 1];}return dp[n - 1] >= (n - 1);}

问题求解:从起始位置能够跳跃到最后的终止位置时,最小的跳跃次数

算法设计:贪心算法(Greedy)

	/** 给定一个非负整数数组,给定的初始化位置在数组的起始位置。* 数组中的每个元素代表着你能都在此位置跳跃的最大的距离。* 你的目标是用最少的跳跃数达到数组的末尾。* 算法:贪心* */public int jump(int[] nums) {if (nums.length <= 1)return 0;if (nums[0] == 0)return -1;// 记录当前活动距离int reach = nums[0];int steps = 0, start = 0;for (; start < nums.length && start <= reach;) {++steps;if (reach >= nums.length - 1) {return steps;}// nextMax表示下一步能到达的最远距离int nextMax = 0;// 在当前start和reach之间,找下一步能到达最远的距离的下标for (int i = start; i <= reach; ++i) {if ((i + nums[i]) > nextMax) {nextMax = i + nums[i];start = i;}}reach = nextMax;}return -1;}

算法设计:贪心算法(Greedy)

	public int jump(int[] nums) {if (nums == null || nums.length == 0) {return -1;}// cur是维护的当前能跳到的最大位置// 第step+1步,能到达的最远距离int cur = 0;// last是指从之前的点能reach到得最远位置// 已经可以到达的最大距离int last = 0;int step = 0;for (int i = 0; i < nums.length/* && i <= cur */; i++) {// 当i 大于之前点能碰到的最大位置时,就需要跳一步,// 并把last更新为cur.if (i > last) {step++;last = cur;}// 计算step+1的最大距离cur = Math.max(cur, nums[i] + i);}// 最后返回若是cur能到最后一个元素,就返回step,// 若是到不了,就说明根本走不到最后一步,返回-1.return cur < nums.length - 1 ? -1 : step;}

更详细的分析,参考LeetCode上的Article栏目分析博文,链接地址:

https://leetcode.com/articles/jump-game/

还可以参考博主 FserSuN 的文章,链接地址:

https://blog.csdn.net/Revivedsun/article/details/52951765

这两篇文章写得非常棒!

 

这篇关于JAVA算法:Jump Game 45题和55题算法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383130

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件