【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
}
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法