机器人能否走到终点位置?

同类题目系列文章

提示:字节跳动20220410算法题2
1.机器人至少要跳多少步才能到终点?


题目

机器人走一步,需要消耗1个单位能量,如果当前位置能量为0,则无法走了
arr每个位置就是能量值arri,机器人可以选择走0–arri步,请问你机器人能走到终点N位置吗?


一、审题

示例:
图1
这个案例呢,在0位置,机器人只能最远走1步
在1位置,能量为5,可以选择走0–5步,但是前面几步没啥意义,走5步到位置6
3个能量,位置6能最远走到9位置,9>=N,就可以到终点


二、解题

这个题和之前我见过的一道题特别类似【**机器人,想要到终点,需要至少跳几步?**后面我会尽快写一篇文章将这俩题本质就是一个东西】——那道题,也是维持一个拿了当前能量,最远你能走到多远。

本题也是,你只需要吃机器人最远它能到哪个位置?
从i跳,下一次的位置是:next=i+arri,它超过了当前mR,更新给mR
任何时候,mR竟然比i还小,说明根本来不来i位置,不能到达N

举个栗子:
图2
组开始:
mR=0,i=0,请问:mR<i吗?不,计算next=i+arri=0+1=1,next>mR,更新mR=1;
mR=1,i=1,请问:mR<i吗?不,计算next=i+arri=1+5=6,next>mR,更新mR=6;
mR=6,i=2,请问:mR<i吗?不,计算next=i+arri=2+0=2,next>mR吗?不,不更新mR=6;
mR=6,i=3,请问:mR<i吗?不,计算next=i+arri=3+0=3,next>mR吗?不,不更新mR=6;
mR=6,i=4,请问:mR<i吗?不,计算next=i+arri=4+0=4,next>mR吗?不,不更新mR=6;
mR=6,i=5,请问:mR<i吗?不,计算next=i+arri=5+1=6,next>mR吗?不,不更新mR=6;
mR=6,i=6,请问:mR<i吗?不,计算next=i+arri=6+3=9,next>mR,更新mR=9;
mR=9,i=7,请问:mR<i吗?不,计算next=i+arri=7+0=7,next>mR吗?不,不更新mR=9;
mR=9,i=8,请问:mR<i吗?不,计算next=i+arri=8+0=8,next>mR吗?不,不更新mR=9;
结束,
此时mR=9>N=8,返回yes

实际上整个过程在干嘛呢?
就是在维持一个最远右边界mR,
你每次来到i,你发现,之前mR,根本它到不了i,则这事行不通
如果可以来到i,看看下一次i+arri能走到的最远next是多少,能走的更远的话,就把next更新给mR
最后看看mR能否越过N,可以就Yes,否则就是No

写代码:

public static class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            // 注意 hasNext 和 hasNextLine 的区别
            int n = in.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = in.nextInt();//读数组,简单
            }

            //之前你走到的最右边mR
            //现在你必须来到i?能来吗,看mR是否能来i,不能就不行
            //既然来到了i,则下一次最有边界i+arri能否大过之前mR,可以就更新给mR
            int mR = 0;//目前已经走到了0
            for (int i = 0; i < n; i++) {
                //必须来到i位置
                if (mR < i) break;//之前你就来不来i,算了吧
                int next = i + arr[i];//既然能来,从i位置跳,最远可以到哪?
                if (next > mR) mR = next;//还能跳更远,但是更好,否则不管
            }

            //不论提前终止,还是走到了N
            if (mR >= n) System.out.println("Yes");
            else System.out.println("No");
        }
    }

总结

提示:重要经验:

1)熟悉和提炼自己练习过的题目,读懂并理解,才是重点,做过又遇到类似的题目,没有解出来,这事敏感度不够,之前的题目不够熟悉和了解。
2)这种跳步的问题,应该不少,之前还有一个,我后面总结一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰露可乐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值