力扣经典150题第十题:跳跃游戏二

2024-04-09 09:44

本文主要是介绍力扣经典150题第十题:跳跃游戏二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • 1. 简介
      • 2. 问题描述
      • 3. 解题思路
        • 方法一:贪心算法
      • 4. 算法实现
        • 方法一:贪心算法
        • 1. 解决方案二:动态规划
          • 思路
          • 实现
        • 复杂度分析
        • 2. 解决方案三:反向贪心算法
          • 思路
          • 实现
        • 复杂度分析
      • 测试示例
      • 5. 示例与测试
      • 6. 总结与展望
      • 7. 结语

1. 简介

本篇博客将讨论力扣经典150题中的跳跃游戏 II 问题。给定一个长度为 n 的整数数组 nums,数组中的每个元素表示从当前位置最多可以跳跃的步数,求到达数组末尾的最小跳跃次数。

2. 问题描述

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例 1:

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

输入: nums = [2,3,0,1,4]
输出: 2

提示:

1 <= nums.length <= 104
0 <= nums[i] <= 1000
题目保证可以到达 nums[n-1]

3. 解题思路

方法一:贪心算法

使用贪心算法解决,维护一个变量 maxReach 表示当前能够达到的最远位置,同时维护两个边界 currentEndfarthest。遍历数组,对于每个位置 i,更新 farthesti + nums[i],当遍历到 currentEnd 时更新跳跃次数并更新 currentEndfarthest

4. 算法实现

方法一:贪心算法
public int jump(int[] nums) {int jumps = 0;int farthest = 0;int currentEnd = 0;for (int i = 0; i < nums.length - 1; i++) {farthest = Math.max(farthest, i + nums[i]);if (i == currentEnd) {jumps++;currentEnd = farthest;}}return jumps;
}
1. 解决方案二:动态规划
思路

使用动态规划来解决该问题。定义一个数组 dp,其中 dp[i] 表示到达位置 i 的最小跳跃次数。初始时,将 dp[0] 设置为 0,对于其他位置 i,初始化为一个较大的数(比如数组长度 n)。然后遍历数组 nums,对于每个位置 i,更新能够到达的位置的最小跳跃次数。

实现
public int jump(int[] nums) {int n = nums.length;int[] dp = new int[n];Arrays.fill(dp, n); // 初始化为较大的数dp[0] = 0;for (int i = 0; i < n; i++) {for (int j = 1; j <= nums[i] && i + j < n; j++) {dp[i + j] = Math.min(dp[i + j], dp[i] + 1);}}return dp[n - 1];
}
复杂度分析
  • 时间复杂度:O(n^2),其中 n 是数组 nums 的长度。两层循环嵌套,每个位置都需要遍历一定范围内的位置。
  • 空间复杂度:O(n),需要额外的数组 dp 存储跳跃次数。
2. 解决方案三:反向贪心算法
思路

使用反向贪心算法来解决该问题。从数组的最后一个位置向前遍历,维护一个变量 position 表示当前需要到达的位置。对于每个位置 i,如果 i + nums[i] >= position,则更新 positioni,并增加跳跃次数。

实现
public int jump(int[] nums) {int jumps = 0;int position = nums.length - 1;while (position > 0) {for (int i = 0; i < position; i++) {if (i + nums[i] >= position) {position = i;jumps++;break;}}}return jumps;
}
复杂度分析
  • 时间复杂度:O(n^2),最坏情况下需要遍历整个数组。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

测试示例

使用相同的测试示例进行验证:

int[] nums1 = {2, 3, 1, 1, 4};
int[] nums2 = {2, 3, 0, 1, 4};System.out.println("Test Case 1:");
System.out.println("Expected Result: 2");
System.out.println("Actual Result (Solution 2): " + jump(nums1));
System.out.println("Actual Result (Solution 3): " + jump(nums1));System.out.println("Test Case 2:");
System.out.println("Expected Result: 2");
System.out.println("Actual Result (Solution 2): " + jump(nums2));
System.out.println("Actual Result (Solution 3): " + jump(nums2));

输出结果为:

Test Case 1:
Expected Result: 2
Actual Result (Solution 2): 2
Actual Result (Solution 3): 2Test Case 2:
Expected Result: 2
Actual Result (Solution 2): 2
Actual Result (Solution 3): 2

以上就是针对力扣经典150题中跳跃游戏 II 的三种解决方案。读者可以根据需求和实际场景选择合适的方法进行应用和实现。

5. 示例与测试

我们使用示例输入进行测试,并验证算法的正确性:

int[] nums1 = {2, 3, 1, 1, 4};
int[] nums2 = {2, 3, 0, 1, 4};System.out.println("Test Case 1:");
System.out.println("Expected Result: 2");
System.out.println("Actual Result: " + jump(nums1));System.out.println("Test Case 2:");
System.out.println("Expected Result: 2");
System.out.println("Actual Result: " + jump(nums2));

输出结果为:

Test Case 1:
Expected Result: 2
Actual Result: 2Test Case 2:
Expected Result: 2
Actual Result: 2

6. 总结与展望

通过本篇博客,我们详细讨论了力扣经典150题中的跳跃游戏 II 问题,并提供了贪心算法的实现方法。这种方法具有高效性和简洁性,在实际应用中具有广泛的适用性。

7. 结语

希望本文能够帮助读者更好地理解和掌握跳跃游戏 II 的解题思路和实现方法,欢迎提出您的宝贵意见和建议。

这篇关于力扣经典150题第十题:跳跃游戏二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

前端 CSS 经典:文字描边

前言:文字描边有两种实现方式 1. text-shadow 设置 8 个方向的文字阴影,缺点是只有八个方向,文字转角处可能有锯齿状。不支持文字透明,设置 color: transparent,文字会成描边颜色。 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Comp

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

LeetCode:经典题之141、142 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 142.环型链表 目录 系列目录141. 环形链表常量因子 1

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

海量数据处理经典思想

第一部分、十五道海量数据处理 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?     方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(