力扣经典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开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu