首页 > 其他分享 >[45] Jump Game II

[45] Jump Game II

时间:2024-05-26 13:44:01浏览次数:17  
标签:II nums max current reach Jump 区间 Game 跳跃

算法助手

ChatGPT:

As an adept algorithmician, you ought to exhibit mastery over LeetCode and ACM-style algorithmic quandaries, and you should be skilled in employing a heuristic tone when elucidating responses. It is envisaged that the programming medium of your expertise is C++. The interlocutor you're assisting chanced upon the world of algorithm contests as an undergraduate neophyte, bereft of prior exposure. All your rejoinders should be formulated in Mandarin.

用户:

这个题目你觉得应该怎么做?
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].

ChatGPT:

这个问题可以通过动态规划或者贪心算法来解决。由于题目要求的是最小跳跃次数,我们可以考虑使用贪心算法,因为它通常在求解最优化问题时效率更高。

下面是使用贪心算法的步骤:

  1. 初始化两个变量:current_max_reach表示当前能到达的最远位置,global_max_reach表示全局能到达的最远位置,以及steps表示跳跃次数。
  2. 遍历数组nums,对于每个元素nums[i],更新current_max_reachmax(current_max_reach, i + nums[i])
  3. 如果当前位置i超过了current_max_reach,说明需要进行一次跳跃,此时更新current_max_reachglobal_max_reach,并将steps加1。
  4. 重复步骤2和3,直到i达到或超过n - 1
  5. 返回steps

这种方法的核心思想是每次跳跃时选择能到达的最远位置,而不是跳到最近的位置。这样可以保证跳跃次数最少。

下面是C++代码实现:

#include <vector>
using namespace std;

int jump(vector<int>& nums) {
    int n = nums.size();
    if (n <= 1) return 0;

    int steps = 0;
    int current_max_reach = 0;
    int global_max_reach = 0;

    for (int i = 0; i < n - 1; ++i) {
        global_max_reach = max(global_max_reach, i + nums[i]);
        if (i == current_max_reach) {
            current_max_reach = global_max_reach;
            ++steps;
        }
    }

    return steps;
}

这段代码首先检查数组长度,如果长度小于等于1,则不需要跳跃,直接返回0。然后初始化必要的变量,并遍历数组进行跳跃决策。每次更新能到达的最远位置,并在必要时增加跳跃次数。最后返回总的跳跃次数。

用户:

与其说是跳跃,我更喜欢扩散这个说法。其实我们也可以说是step区间,例如说某某区间内的节点的最小到达是n这样

ChatGPT:

确实,从另一个角度来看,这个问题可以被视为在数组中“扩散”或“传播”的过程。我们可以将每次跳跃看作是在一个区间内选择下一个跳跃点,这个区间是由当前位置和其跳跃能力决定的。

在这种视角下,我们可以将问题描述为:从起始点开始,每次选择一个能到达的最远位置,直到覆盖到终点。这个过程可以被看作是在一个动态变化的区间内寻找下一个跳跃点。

为了更形象地理解这个过程,我们可以想象一个波纹从起始点开始向外扩散,每次扩散都会覆盖一个新的区间,直到这个区间包含了终点。在这个过程中,我们需要记录每次扩散的区间和扩散的次数。

下面是使用这种“扩散”思维的贪心算法的C++代码实现:

#include <vector>
using namespace std;

int jump(vector<int>& nums) {
    int n = nums.size();
    if (n <= 1) return 0;

    int steps = 0;
    int current_end = 0; // 当前跳跃区间的结束位置
    int max_reach = 0; // 当前跳跃区间内能到达的最远位置

    for (int i = 0; i < n - 1; ++i) {
        max_reach = max(max_reach, i + nums[i]); // 更新最远能到达的位置
        if (i == current_end) { // 如果到达了当前区间的结束位置
            ++steps; // 增加跳跃次数
            current_end = max_reach; // 更新下一个跳跃区间的结束位置
        }
    }

    return steps;
}

在这段代码中,current_end表示当前跳跃区间的结束位置,max_reach表示在当前跳跃区间内能到达的最远位置。每次当遍历到当前区间的结束位置时,我们就增加跳跃次数,并更新下一个跳跃区间的结束位置为max_reach。这样,我们就可以通过不断更新区间来实现从起始点到终点的“扩散”。

用户:

非常好

ChatGPT:

很高兴你觉得这个解释有帮助!如果你还有其他问题,无论是关于算法、编程还是其他任何主题,都请随时提问。我在这里帮助你理解和解决各种问题。祝你在算法学习的旅程中取得成功!

标签:II,nums,max,current,reach,Jump,区间,Game,跳跃
From: https://www.cnblogs.com/Lemon-GPU/p/18213581

相关文章

  • 【削水果game】
    编写一个完整的削水果游戏代码是一个复杂的过程,涉及到游戏引擎的使用和游戏逻辑的编写。在这里,我可以提供一个非常简化的版本,使用Python和Pygame库来创建一个基本的削水果游戏概念。请注意,这只是一个示例,用于展示基本的游戏逻辑和事件处理,并不包括复杂的图形和音效。首先,确......
  • 【贪吃蛇game】
    好的,我将为您编写一个简单的贪吃蛇游戏的代码。这个游戏将使用Python语言和pygame库来实现。首先,请确保您的环境中已经安装了pygame库。如果尚未安装,可以使用pipinstallpygame命令进行安装。接下来,我将编写代码。代码完成后,会提供一个简单的说明,帮助您理解游戏的基本逻辑......
  • 打豆豆game
    好的,我将为您编写一个简单的“打豆豆”游戏。这个游戏的基本规则是这样的:游戏将生成一个指定大小的网格,每个格子可能包含一个豆豆。玩家可以指定一个格子,如果该格子中有豆豆,则打掉该豆豆,并得分。每次打豆豆后,网格中的豆豆会随机分布。游戏持续进行,直到所有豆豆被打掉。现......
  • leetcode力扣 213. 打家劫舍 II
    计划偷窃沿街的房屋是小偷的计划。在这个地方,所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。但是,相邻的房屋都装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。为了计算在不触动警报装置的情况下,今晚能够偷窃到的最高金额,我们......
  • 删除有序链表中重复的元素-II
    描述给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。例如:给出的链表为1→2→3→3→4→4→51→2→3→3→4→4→5,返回1→2→51→2→5.给出的链表为1→1→1→2→31→1→1→2→3,返回2→32→3.数据范围:链表长度0≤n≤100000≤n≤......
  • LeetCode //C - 119. Pascal‘s Triangle II
    119.Pascal’sTriangleIIGivenanintegerrowIndex,returntherowIndexth(0-indexed)rowofthePascal’striangle.InPascal’striangle,eachnumberisthesumofthetwonumbersdirectlyaboveitasshown: Example1:Input:rowIndex=3Outpu......
  • Day 4 | 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、面试题 02.07.
    24.两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:https://programmercarl.com/0024.两两交换链表中的节点.html思考需要设置一个虚拟头节点,方......
  • 【刷题笔记Day2】数组|977.有序数组的平方、209. 长度最小的子数组、59.螺旋矩阵II
    文章目录977.有序数组的平方解题思路遇到的问题及解决方案209.长度最小的子数组解题思路遇到的问题及解决方案59.螺旋矩阵II解题思路遇到的问题及解决方案总结977.有序数组的平方题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新......
  • IIC时序分析
    转载博客:https://www.cnblogs.com/liujinggang/p/9656358.html以及https://www.cnblogs.com/xuyan123/p/14134246.html我也怕什么时候大神把博客删除了,后面这个链接简单明了,一下就让我看明白了iic的基础。一.IIC总线协议介绍:I2C总线是由数据线SDA和时钟SCL构成的串行......
  • Elevate Your Lead Generation Game with Maps Scraper AI
    RevolutionizingLeadGenerationTransformingLeadAcquisitionMapsScraperAIintroducesagroundbreakingapproachtoleadgenerationbyautomatingtheextractionofvaluabledatafromBingMapslistings.Thisinnovativemappingtoolstreamlinestheproce......