【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
}
相关推荐
_OP_CHEN2 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1232 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九2 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈3 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
呆呆敲代码的小Y3 小时前
【Unity 实用工具篇】 | Book Page Curl 快速实现翻书效果
游戏·unity·游戏引擎·u3d·免费游戏·翻书插件
串流游戏联盟3 小时前
星铁4.0前瞻开启!手机玩家体验或将进一步下降
游戏·远程工作
renke33643 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字迷宫游戏,从随机路径生成到认知训练系统的完整工程实践与跨学科深度解析
flutter·游戏
子春一3 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
草履虫建模9 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq11 小时前
分布式系统安全通信
开发语言·c++·算法