⭐算法OJ⭐跳跃游戏【贪心算法】(C++实现)Jump Game 系列 I,II

news/2025/3/6 19:18:13/

既股票买卖系列之后的第二组贪心算法题目:跳跃游戏系列。这一篇介绍的两个问题,其输入均为一个数组,每个元素表示在该位置可以跳跃的最大长度。

55. Jump Game

You are given an integer array nums. You are initially positioned at the array’s first index, and each element in the array represents your maximum jump length at that position.

Return true if you can reach the last index, or false otherwise.

Example 1:

Input: nums = [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: nums = [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.

问题描述

给定一个非负整数数组,每个元素表示在该位置可以跳跃的最大长度。判断是否能够到达最后一个下标。

贪心策略

  • 维护一个最远可到达的位置 max_reach
  • 遍历数组,更新 max_reach
  • 如果 max_reach 超过最后一个下标,则返回 True

解题思路

这是一个典型的贪心算法问题。我们可以通过维护一个变量 max_reach 来记录当前能够到达的最远位置。遍历数组时,更新 max_reach,并检查是否能够到达或超过最后一个下标。

步骤

  • 初始化 max_reach = 0,表示当前能够到达的最远位置。
  • 遍历数组 nums
    • 如果当前位置 i 超过了 max_reach,说明无法到达当前位置,返回 false
    • 更新 max_reachmax(max_reach, i + nums[i])
    • 如果 max_reach 已经大于或等于最后一个下标,返回 true
  • 遍历结束后,如果 max_reach 大于或等于最后一个下标,返回 true,否则返回 false
bool canJump(vector<int>& nums) {int max_reach = 0;for (int i = 0; i < nums.size(); i++) {if (max_reach < i) {return false;}max_reach = max(max_reach, i + nums[i]);if (max_reach >= nums.size() - 1) {return true;}}if (max_reach >= nums.size() - 1) {return true;}else {return false;}
}

复杂度分析

  • 时间复杂度:只需要遍历数组一次,时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是数组的长度。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O ( 1 ) O(1) O(1)

45. Jump Game II

You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0].

Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], you can jump to any nums[i + j] where:

  • 0 <= j <= nums[i] and
  • i + j < n

Return the minimum number of jumps to reach nums[n - 1]. The test cases are generated such that you can reach nums[n - 1].

Example 1:

Input: nums = [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.

Example 2:

Input: nums = [2,3,0,1,4]
Output: 2

解题思路

这是一个典型的贪心算法问题。我们需要找到到达最后一个下标的最小跳跃次数。可以通过维护两个变量来解决:

  • 当前跳跃范围:[start, end],表示当前跳跃可以到达的范围。
  • 最远可到达位置:max_reach,表示在当前跳跃范围内,能够到达的最远位置。

步骤

  • 初始化:
    • jumps = 0:记录跳跃次数。
    • end = 0:当前跳跃范围的结束位置。
    • max_reach = 0:当前跳跃范围内能够到达的最远位置。
  • 遍历数组 nums
    • 更新 max_reachmax(max_reach, i + nums[i])
    • 如果当前位置 i 到达了当前跳跃范围的结束位置 end
      • 增加跳跃次数 jumps++
      • 更新 endmax_reach,表示进入下一个跳跃范围。
  • 返回 jumps
int jump(vector<int>& nums) {int jumps = 0;      // 记录跳跃次数int end = 0;        // 当前跳跃范围的结束位置int max_reach = 0;  // 当前跳跃范围内能够到达的最远位置for (int i = 0; i < nums.size() - 1; i++) {max_reach = max(max_reach, i + nums[i]);// 如果当前位置到达了当前跳跃范围的结束位置if (i == end) {jumps++;       // 增加跳跃次数end = max_reach; // 更新跳跃范围}}return jumps;
}

复杂度分析

  • 时间复杂度:只需要遍历数组一次,时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是数组的长度。
  • 空间复杂度:只使用了常数级别的额外空间,空间复杂度为 O ( 1 ) O(1) O(1)

http://www.ppmy.cn/news/1577145.html

相关文章

从零开始构建高效Spring Boot应用:实战案例与最佳实践

摘要 本文旨在为初学者及有一定基础的开发者提供一份详尽的指南&#xff0c;以帮助大家深入理解并掌握如何使用Spring Boot框架来快速开发企业级应用程序。通过实际案例分析、代码示例以及架构设计思路分享&#xff0c;读者不仅能够学习到理论知识&#xff0c;还能获得宝贵的实…

网络原理---HTTP/HTTPS

通过之前的网络编程&#xff0c;我们已经初步了解UDP和TCP的基本实现方法&#xff0c;接下来我们对其进一步的学习。 在网络编程中&#xff1a; 1.读和写数据通过Socket&#xff0c;通过Socket内置的InputStream和OutputStream(读写的基本单位都是字节&#xff09;。2.当在编…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

游戏引擎学习第137天

演示资产系统中的一个 bug 我们留下了个问题&#xff0c;你现在可以看到&#xff0c;移动时它没有选择正确的资产。我们知道问题的原因&#xff0c;就在之前我就预见到这个问题会出现。问题是我们的标签系统没有处理周期性边界的匹配问题。当处理像角度这种周期性的标签时&…

【基于手势识别的音量控制系统】

基于手势识别的音量控制系统 github 项目效果 这是一个结合了计算机视觉和系统控制的实用项目&#xff0c;通过识别手势来实现音量的无接触控制&#xff0c;同时考虑到了用户隐私&#xff0c;加入了实时人脸遮罩功能。 核心功能实现 1. 手势识别与音量映射 系统使用 Media…

扫描纸质文件转pdf---少页数+手机+电脑协作

针对手机上扫描软件扫描文件转pdf要收费的问题&#xff0c;提供一种在页数较少时的免费替代方案 。 实现方法&#xff1a;手机软件的免费功能将文件扫描并保存为图片电脑端在word中将图片拼成文档word转pdf 1.借助于“扫描全能王”APP可以免费扫描文件为图片的功能&#xff0…

阿里万相,正式开源

大家好&#xff0c;我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门&#xff0c;而且还是免费向所有人敞开的那种。 你想想看&#xff0c;在这个科技飞速发展的时代&#xff0c;AI就像是拥有神奇魔法的魔法师&#xff0c;不断地给我们带来各种意想…

【问题解决】Jenkins使用File的exists()方法判断文件存在,一直提示不存在的问题

小剧场 最近为了给项目组提供一个能给Java程序替换前端、后端的增量的流水线&#xff0c;继续写上了声明式流水线。 替换增量是根据JSON配置文件去增量目录里去取再替换到对应位置的&#xff0c;替换前需要判断增量文件是否存在。 判断文件是否存在&#xff1f;作为一个老Ja…