开发者社区> 问答> 正文

遇到一个超车问题,求解答

一天某地在举行公路自行车比赛,一共有n名选手参加(2<=n<=100000),在比赛的过程中,有一段路程观众是看不见的,现在给你了选手进入这段路程的顺序编号,又给了选手出这段路程的顺序编号(顺序按照先进先出的原则,编号为 1-n),请你计算一下,有多少名选手在这段公路上完成了超车(出路段后超过了进路段前在自己前面的选手)。第一行输入一个数n,第二行输入n个数,表示选手进入路段的顺序,第三行输入 n 个数,表示选手出路段时的顺序输出一个数 s,表示有 s 名选手在该路段中超车

展开
收起
游客4skzfvnrxrzbi 2021-12-23 17:12:38 1200 0
1 条回答
写回答
取消 提交回答
  • 根据题意,超车意味着对于入洞前序列中的每辆车x及x前面的车集合{a,b,c,d...},如果在出洞序列中,发现 x 前面的某车,出洞时不在 {a,b,c,d...} 集合中,就说明x超过了这辆不在{a,b,c,d...}集合中的车。而且这个超车行为与其他车无关,也就是说,即使上面个的清空中 x 的排名后撤了,被其它车超过了,它也依然被视为发生了超车。“只要超过了一辆车,就算发生了超车”。根据上面思路,首先需要遍历入洞序列,对每辆车 x 遍历,同时用一个列表记录下入洞序列中 x 前面的车。对这样的 x 和列表,再去出洞序列中从尾部开始遍历,直到发现 x 停止。如果遍历出洞序列的过程中,发现某车存在于列表中,说明这辆车入洞前在 x 的前面且出洞后在 x 的后面,发生了超车,此时令结果加 1。如果简单应用这种代码,不加优化,会有嵌套循环,时间复杂度很高,不能通过。上面的思路中,耗时最多的部分,就是内循环在出洞序列中,判断“入洞序列在x 前面车的集合”,有没有出现在 x 的后面这个步骤。如果直接查找,由于出洞序列没有顺序,不可以使用二分查找,只能从挨个线性搜索出洞序列数组,时间复杂度非常高。所以我们先从这里切入,尝试优化。根据上面的定义,我们想,既然 x 只要超过入洞序列中,x 前面的任何一辆车就算超车,而且题目不要求我们求出超过了哪辆车,也不要求求出超过了几辆车,那么我们可不可以将超过一辆车的行为,视为 x 超过了入洞序列 x 前面所有车组成的车队的行为呢?首先我们需要用哈希表(或者表示入洞出洞顺序的数组),记录下每辆车出洞和入洞排名的对应关系;之后从 0(或者说 1)开始遍历入洞排名,找到入洞序列中排名i-1 及 i-1 之前的车组成的 “车队”,在出洞序列中覆盖的范围,你不需要记录这个范围中具体覆盖了那些车,只需要记录这个范围的第一辆车 a 和最后一辆车 z。最后,判断i车在出洞时的位置x,是否超过了这个车队的最后一辆车的位置z。如果超过了,说明发生了超车,如果未超过,说明可以把 i 车也加入到车队中,将车队的最后一辆车位置更新为 x。然后继续这个遍历过程,就可以得到结果:image.png 这种解法利用了哈希表查找速度,编写合理的话,时间复杂度会比较低。 因此输入:5 [4,2,1,3,5] [2,4,1,5,3] 输出:2 注:输入样例表示 4 第一个进,2 第二个进 .... 然后 2 第一个出,4 第二个出 ...

    2021-12-23 18:58:56
    赞同 1 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
独角兽炼成记 立即下载
城市大脑是怎样炼成的 立即下载
【年终特辑】看见科技创新力量 洞见时代创业精神——2022年 立即下载