【LeetCode】LCP 09. 最小跳跃次数

题目:LCP 09. 最小跳跃次数

LCP 09. 最小跳跃次数
为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机。游戏机由 N 个特殊弹簧排成一排,编号为0N-1。初始有一个小球在编号0的弹簧处。若小球在编号为i的弹簧处,通过按动弹簧,可以选择把小球向右弹射jump[i]的距离,或者向左弹射到任意左侧弹簧的位置。也就是说,在编号为i弹簧处按动弹簧,小球可以弹向0i-1中任意弹簧或者i+jump[i]的弹簧(若i+jump[i]>=N,则表示小球弹出了机器)。小球位于编号0处的弹簧时不能再向左弹。

为了获得奖励,你需要将小球弹出机器。请求出最少需要按动多少次弹簧,可以将小球从编号0弹簧弹出整个机器,即向右越过编号N-1的弹簧。

示例 1:

输入:jump = [2, 5, 1, 1, 1, 1]
输出:3
解释:小 Z 最少需要按动 3 次弹簧,小球依次到达的顺序为 0 -> 2 -> 1 -> 6,最终小球弹出了机器。

限制:

  • 1 <= jump.length <= 10^6
  • 1 <= jump[i] <= 10000

解题思路

思路

当前位置可以跳到下一位置和之前任意位置,之前任意位置、下一位置都是可达的,步数为当前步数+1。
遍历时需要考虑哪些位置已经遍历过。

步骤

  1. 设置队列q,存放当前index和步数。
    设置bool数组seen,记录index是否可达。
    设置preidx用于存放当前可达位置之前位置。
  2. 遍历队列q,每次取出队首元素idxd
    1. 下一步可达位置nextidx + jump[idx]。如果能够跳出数组,则返回d+1,否则将next位置标记为可达,并将到达next的步数d+1存入队列q。
    2. 如果predix比当前idx小,把从preidxidx之间位置全部标志为可达,并存入队列,predix为idx+1.
  3. 遍历完成后未返回说明不可跳出。

代码

class Solution {
public:
// 1. 设置队列q,存放当前index和步数。
// 	设置bool数组seen,记录index是否可达。
// 	设置`preidx`用于存放当前可达位置之前位置。
// 2. 遍历队列q,每次取出队首元素`idx`和`d`。
// 	1. 下一步可达位置`next`为`idx + jump[idx]`。如果能够跳出数组,则返回`d+1`,否则将`next`位置标记为可达,并将到达`next`的步数`d+1`存入队列q。
// 	2. 如果`predix`比当前`idx`小,把从`preidx`到`idx`之间位置全部标志为可达,并存入队列,predix为idx+1.
// 3. 遍历完成后未返回说明不可跳出。
    int minJump(vector<int>& jump) {
        queue<pair<int, int>> q;
        q.emplace(0, 0);
        vector<bool> seen (jump.size(), false);
        int predix = 1;

        while (!q.empty()) {
            int idx = q.front().first;
            int d = q.front().second;
            q.pop();

            int next = idx + jump[idx];
            if (next > jump.size() - 1) return d + 1;
            if (!seen[next]) {
                seen[next] = true;
                q.emplace(next, d + 1);
            }

            while (predix < idx) {
                if (!seen[predix]) {
                    seen[predix] = true;
                    q.emplace(predix, d + 1);
                }
                predix++;
            }
        }
        return -1;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhShy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值