← 返回目录

算法笔试模拟题精解之“超车”

第 71 / 74 卷日期:

算法笔试模拟题精解之“超车”

贡献者 | 洪浩原

简介:只要超过了一辆车,就算发生了超车,按照此思路批量判断超车,提高内

循环的效率。

题目描述

等级:容易

知识点:模拟

查看题目:超车

一天某地在举行公路自行车比赛,一共有 n 名选手参加 (2<=n<=100000),在

比赛的过程中,有一段路程观众是看不见的,现在给你了选手进入这段路程的顺序编

号,又给了选手出这段路程的顺序编号(顺序按照先进先出的原则,编号为 1-n),请

你计算一下,有多少名选手在这段公路上完成了超车(出路段后超过了进路段前在自

己前面的选手)。

第一行输入一个数 n,第二行输入 n 个数,表示选手进入路段的顺序,第三行输

入 n 个数,表示选手出路段时的顺序输出一个数 s,表示有 s 名选手在该路段中超车

示例 1

输入:

5

[4,2,1,3,5]

输出:

2

注意

输入样例表示 4 第一个进,2 第二个进 .... 然后 2 第一个出,4 第二个出 ...

解题思路详解

方法 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。

如果简单应用这种代码,不加优化,会有嵌套循环,时间复杂度很高,不能通过。

时间复杂度:O(n^2)

空间复杂度:O(1)

方法 2:批量判断超车,提高内循环的效率

上面的思路中,耗时最多的部分,就是内循环在出洞序列中,判断“入洞序列在

x 前面车的集合”,有没有出现在 x 的后面这个步骤。如果直接查找,由于出洞序列

常高。所以我们先从这里切入,尝试优化。

根据上面的定义,我们想,既然 x 只要超过入洞序列中,x 前面的任何一辆车就

算超车,而且题目不要求我们求出超过了哪辆车,也不要求求出超过了几辆车,那么

我们可不可以将超过一辆车的行为,视为 x 超过了入洞序列 x 前面所有车组成的车队

的行为呢?

首先我们需要用哈希表(或者表示入洞出洞顺序的数组),记录下每辆车出洞和

入洞排名的对应关系;之后从 0(或者说 1)开始遍历入洞排名,找到入洞序列中排名

i-1 及 i-1 之前的车组成的“车队”,在出洞序列中覆盖的范围,你不需要记录这个范

围中具体覆盖了那些车,只需要记录这个范围的第一辆车 a 和最后一辆车 z。最后,

判断 i 车在出洞时的位置 x,是否超过了这个车队的最后一辆车的位置 z。如果超过

了,说明发生了超车,如果未超过,说明可以把 i 车也加入到车队中,将车队的最后

一辆车位置更新为 x。然后继续这个遍历过程,就可以得到结果:

图 184-1
图 184-1

这种解法利用了哈希表查找速度,编写合理的话,时间复杂度会比较低。

时间复杂度:O(n)

空间复杂度:O(2n)

看完之后是不是有了答题思路了呢,快来练练手吧:超车

全站分卷索引 · 74 卷
  1. 1一、算法思想
  2. 2算法笔试模拟题精解之“打怪兽”
  3. 31.2 贪心
  4. 4算法笔试模拟题精解之“最强的团队”
  5. 5算法笔试模拟题精解之“Tom 爱吃巧克力”
  6. 6算法笔试模拟题精解之“吃奶酪”
  7. 7算法笔试模拟题精解之“一的个数”
  8. 8算法笔试模拟题精解之“Bob 的花束”
  9. 9算法笔试模拟题精解之“钱庄”
  10. 10算法笔试模拟题精解之“移动射击”
  11. 11算法笔试模拟题精解之“相似数组”
  12. 12算法笔试模拟题精解之“过吊桥”
  13. 13算法笔试模拟题精解之“完美排列”
  14. 14算法笔试模拟题精解之“采摘圣诞果”
  15. 15算法比赛模拟题精解之“Tairitsu and Dynamic Objects”
  16. 16算法笔试模拟题精解之“Codancer 的炸弹引爆”
  17. 17算法笔试模拟题精解之“学习小组”
  18. 18算法笔试模拟题精解之“恢复字符串”
  19. 191.3 DP/ 动态规划
  20. 20算法笔试模拟题精解之“寻找等比数列”
  21. 21算法笔试模拟题精解之“字符配对”
  22. 22算法笔试模拟题精解之“数组染色”
  23. 23算法笔试模拟题精解之“连绵的群山”
  24. 24算法笔试模拟题精解之“难住Tom 的问题”
  25. 25算法笔试模拟题精解之“变化的字符”
  26. 26算法笔试模拟题精解之“跳房子”
  27. 27算法笔试模拟题精解之“寒假活动”
  28. 28算法笔试模拟题精解之“最短路”
  29. 29算法笔试模拟题精解之“codancer 上楼”
  30. 30算法笔试模拟题精解之“木棒拼接”
  31. 31算法笔试模拟题精解之“Codancer 的数组封印”
  32. 32算法笔试模拟题精解之“Jerry 的异或运算”
  33. 33算法笔试模拟题精解之“小明的数学作业”
  34. 34算法笔试模拟题精解之“奇偶数列”
  35. 351.4 剪枝
  36. 361.5 尺取法
  37. 37算法笔试模拟题精解之“调整数组”
  38. 38算法笔试模拟题精解之“最优分组”
  39. 39算法笔试模拟题精解之“破译密码”
  40. 40二、数据结构
  41. 412.2 搜索
  42. 42算法笔试模拟题精解之“能量半径”
  43. 43算法笔试模拟题精解之“苹果收获程序”
  44. 44算法笔试模拟题精解之“恐怖的辐射”
  45. 45算法笔试模拟题精解之“树的拆分”
  46. 46算法笔试模拟题精解之“Password”
  47. 47算法笔试模拟题精解之“神奇数字在哪里”
  48. 48算法笔试模拟题精解之“神奇的棋子”
  49. 492.3 树
  50. 50算法笔试模拟题精解之“Codancer 的旅行”
  51. 51算法笔试模拟题精解之“Codancer 的求和”
  52. 52算法笔试模拟题精解之“找出二叉搜索树的第2 大的数”
  53. 532.4 线型
  54. 54算法笔试模拟题精解之“最活跃的数”
  55. 55算法笔试模拟题精解之“非递减序列”
  56. 56算法笔试模拟题精解之“Tom 跳方格”
  57. 57算法笔试模拟题精解之“复杂的字符串”
  58. 58算法笔试模拟题精解之“神秘消失”
  59. 59三、计算
  60. 60算法笔试模拟题精解之“简单题?
  61. 61算法笔试模拟题精解之“朋友一生一起走”
  62. 62算法笔试模拟题精解之“正三角塔”
  63. 63算法笔试模拟题精解之“组队难题”
  64. 64算法笔试模拟题精解之“2n 合体”
  65. 65算法笔试模拟题精解之“平行线”
  66. 66算法笔试模拟题精解之“叠叠高”
  67. 67算法笔试模拟题精解之“公平”
  68. 68算法笔试模拟题精解之“Tom 的手工课”
  69. 69算法笔试模拟题精解之“填数问题”
  70. 70算法笔试模拟题精解之“Jerry 的考验”
  71. 71算法笔试模拟题精解之“超车”
  72. 72算法笔试模拟题精解之“坏掉的时钟”
  73. 73算法笔试模拟题精解之“期末考试”
  74. 74算法笔试模拟题精解之“滑雪比赛”