同类题目系列文章
提示:字节跳动20220410算法题2
1.机器人至少要跳多少步才能到终点?
题目
机器人走一步,需要消耗1个单位能量,如果当前位置能量为0,则无法走了
arr每个位置就是能量值arri,机器人可以选择走0–arri步,请问你机器人能走到终点N位置吗?
一、审题
示例:
这个案例呢,在0位置,机器人只能最远走1步
在1位置,能量为5,可以选择走0–5步,但是前面几步没啥意义,走5步到位置6
3个能量,位置6能最远走到9位置,9>=N,就可以到终点
二、解题
这个题和之前我见过的一道题特别类似【**机器人,想要到终点,需要至少跳几步?**后面我会尽快写一篇文章将这俩题本质就是一个东西】——那道题,也是维持一个拿了当前能量,最远你能走到多远。
本题也是,你只需要吃机器人最远它能到哪个位置?
从i跳,下一次的位置是:next=i+arri,它超过了当前mR,更新给mR
任何时候,mR竟然比i还小,说明根本来不来i位置,不能到达N
举个栗子:
组开始:
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)这种跳步的问题,应该不少,之前还有一个,我后面总结一下。