重邮复试题——隧道超车
设置m为车辆数,in数组为入隧道排序,out数组为出隧道排序
基本思想:
某一辆车发生了超车,后面车辆的正常(没超车)的出隧道序列是不应该改变的
代码原理:
如果out[0] == in[0]说明没有发生超车,把out[0],in[0]弹出,继续访问out[0]和in[0]
如果out[0] != in[0]说明发生了超车,记录+1,out[0]弹出,删除in中等于out[0]的元素,继续重复上述操作
但是由于在in中删除某个元素花销太大,所以使用一个visit数组来查看某个元素是否在out中已经访问过了。
由上面原理不难看出来两种情况都是在依次访问out数组的元素,而in数组如果没有发生超车则访问下一个,如果超车了就不动,但是可能出现in数组当前访问的元素是已经被删除的,所以每次增加in的下标是都要在visit中检测是否被访问过,访问过就+1
设置一个index指针指向in(车辆进入隧道排列)待访问位置
使用一个大小为m的visit数组标志某个成员是否被访问过,访问过置1
依次遍历out(车辆出隧道的排列)数组。
时间复杂度O(m), 空间复杂度O(m)
class Solution {
public:
int func(int m, vector<int> in, vector<int> out) {
vector<bool> visit(m, 0);
int index = 0, res = 0;
for (int i = 0; i < m; i++) {
while (visit[in[index] - 1] == 1)
index++;
if (out[i] != in[index]) {
visit[out[i] - 1] = 1;
res++;
}
else {
index++;
}
}
return res;
}
};
int main()
{
int m = 4;
vector<int> in = { 1,2,3,4 };
vector<int> out = { 1,3,2,4 };
Solution s;
cout << s.func(m, in, out);
return 0;
}```