#include<bits/stdc++.h> using namespace std; const int N=2e5+10; int e[N],ne[N],idx,head=-1; int c[N]; int n,m,k; int main() { cin>>n>>m; getchar(); e[idx]=1,ne[idx]=head,head=idx++; for(int i=2;i<=n;i++) e[idx]=i,ne[idx]=ne[idx-1],ne[idx-1]=idx++; while(m--) { char s; int b; scanf("%c %d",&s,&b); getchar(); if(s=='L') { for(int i=head;i!=-1;i=ne[i]) { if(b==e[i]) { ne[k]=ne[ne[k]]; break; } k=i; } e[idx]=b,ne[idx]=head,head=idx++; //ne[b-2]=ne[ne[b-2]]; } else { for(int i=head;i!=-1;i=ne[i]) { if(b==e[i]) { ne[k]=ne[ne[k]]; break; } k=i; } e[idx]=b,ne[idx]=ne[n-1],ne[n-1]=idx++; } } for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<' '; return 0; }为什么超时
时间: 2024-01-27 07:06:26 浏览: 71
这段代码的时间复杂度是O(N*M),其中 N 表示序列的长度,M 表示操作的次数,当 N 和 M 的值较大时,程序的执行时间会比较长,可能导致超时。
主要原因在于,每次在链表中查找节点的位置时,都需要从头节点开始遍历,这样的时间复杂度是 O(N),而操作次数 M 可能会很大,因此整个程序的时间复杂度是 O(N*M)。
为了优化时间复杂度,可以使用哈希表(unordered_map)来记录每个节点的位置,这样可以将节点查找的时间复杂度降为 O(1),从而优化整个程序的时间复杂度。
以下是示例代码:
```c++
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int e[N], ne[N], idx, head = -1;
int c[N];
int n, m, k;
unordered_map<int, int> pos;
int main() {
cin >> n >> m;
getchar();
e[idx] = 1, ne[idx] = head, head = idx++;
pos[1] = 0;
for (int i = 2; i <= n; i++) {
e[idx] = i, ne[idx] = ne[idx - 1], ne[idx - 1] = idx++;
pos[i] = i - 1;
}
while (m--) {
char s;
int b;
scanf("%c %d", &s, &b);
getchar();
if (s == 'L') {
int p = pos[b];
pos[b] = -1;
ne[p] = ne[ne[p]];
pos[e[ne[p]]] = p;
e[idx] = b, ne[idx] = head, head = idx++;
pos[b] = 0;
} else {
int p = pos[b];
pos[b] = -1;
ne[p] = ne[n - 1];
pos[e[ne[p]]] = p;
e[idx] = b, ne[idx] = ne[n - 1], ne[n - 1] = idx++;
pos[b] = n - 1;
}
}
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
return 0;
}
```
在上述代码中,我们使用了 unordered_map 来记录每个节点的位置。在插入节点时,将其位置存储在 pos 数组中;在删除节点时,将其在 pos 数组中的位置标记为 -1,表示该节点已经被删除。这样在查找节点位置时,只需要使用 O(1) 的时间即可。
另外,在删除节点时,我们需要更新被删除节点的前一个和后一个节点的位置,以及新加入节点的位置。这样可以保证链表的正确性。
阅读全文