【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
}
相关推荐
xin_nai8 小时前
LeetCode热题100(Java)(6)矩阵
java·leetcode·矩阵
Old Uncle Tom14 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆14 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移14 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业14 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
圣保罗的大教堂16 小时前
leetcode 1855. 下标对中的最大距离 中等
leetcode
智者知已应修善业17 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.54817 小时前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove18 小时前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊18 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法