【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
}
相关推荐
游乐码5 分钟前
Unity基础(四)向量相关
游戏·unity·游戏引擎
数智工坊14 分钟前
【UniT论文阅读】:用统一物理语言打通人类与人形机器人的知识壁垒
论文阅读·人工智能·深度学习·算法·机器人
梓䈑16 分钟前
【算法题攻略】模拟
c++·算法
Evand J19 分钟前
【课题推荐与代码介绍】卡尔曼滤波器正反向估计算法原理与MATLAB实现
开发语言·算法·matlab
DFT计算杂谈22 分钟前
VASP新手入门: IVDW 色散修正参数
linux·运维·服务器·python·算法
吃着火锅x唱着歌38 分钟前
LeetCode 962.最大宽度坡
算法·leetcode·职场和发展
无限进步_1 小时前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
WL_Aurora1 小时前
Python 算法基础篇之排序算法(一):冒泡、选择、插入
python·算法·排序算法
凌波粒1 小时前
LeetCode--257. 二叉树的所有路径(二叉树)
算法·leetcode·职场和发展
AI算法沐枫1 小时前
大一学生如何入门机器学习,深度学习,学习顺序如何?
人工智能·python·深度学习·学习·线性代数·算法·机器学习