【Golang】LeetCode 45. 跳跃游戏 II

45. 跳跃游戏 II

题目描述

思路

我们仍然使用贪心来解决这个问题。

具体来说,想要以"最少的次数"到达最终节点,我们要做的其实是从起点开始,每一次尽可能选择跳到"可用步数最多"的那个节点。因此,我们使用一个变量maxPos来记录当前能够挑战到的最远的位置。同时,我们应该知道上一次跳跃的终点位置,我们设置end变量,它的初始值为0

接下来,我们使用i0..<n - 1进行遍历,如果满足i == end,就说明当前已经走到了上一次最远能够达到的终点,设置end = maxPos,并令ans += 1。初始时,i == endend == 0,也就是说在第一个位置一定需要向后跳一次;令end = maxPos,而maxPos此时就是max(maxPos, i + nums[i]) = i + nums[i],也就是从起点能够跳转到的最大的位置。

在对i进行遍历的过程中,maxPos会随时改变。通过判断i == end,我们能够知道当前是否需要跳转并对end进行更新。以[2, 7, 1, 1, 4]为例,初始时我们一定需要向后跳转一次,也就是在i == 0时,i == endend == 0,此时ans += 1end = maxPos,而此时的maxPos = max(maxPos, i + nums[i])maxPos == 2。之后我们不断地使用i来遍历nums,期间maxPos确实得到了更新,但是end == 2;直到i == 2时,才会进行一次跳转,令ans += 1,并令end = maxPos。此时end == 8,满足end > n,我们永远不会遍历到这个位置,因此最终的答案就是2,也就是只需两次跳转即可到达终点。

基于以上思路,我们写代码来解决问题。

Golang 题解

go 复制代码
func jump(nums []int) int {
    n := len(nums)
    end, maxPos, ans := 0, 0, 0
    for i := 0; i < n - 1; i ++ {
        maxPos = max(maxPos, i + nums[i])
        if i == end {
            ans ++
            end = maxPos
        }
    }
    return ans
}
相关推荐
毕竟是shy哥2 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂3 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h4 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦4 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小小数媒成员6 小时前
【8.29-8.31】游戏见闻*
游戏
小白羊丨8 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F10 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法