|
发表于 2024-1-18 16:58:55
|
显示全部楼层
这道题的关键是如何改进时间复杂度。目前的代码中,每次执行操作2时,都需要遍历整个队列来查询并删除队首元素,导致时间复杂度为O(n),其中n表示当前队列的长度。而操作3中,每次都需要对整个队列进行排序,时间复杂度也是O(nlogn)。
我们可以使用两个队列来优化这个问题。一个队列用来保存原始的输入数据,另一个队列用来保存当前队列的有序状态。具体做法如下:
1. 当执行插入操作时,将元素插入到原始队列的末尾,并同时插入到有序队列的合适位置。
2. 当执行查询并删除队首元素操作时,直接从有序队列的队首获取即可,并从原始队列中删除。
3. 当执行排序操作时,不需要对整个队列进行排序,只需重新确定有序队列的元素顺序即可。
以下是改进后的代码:
- #include <iostream>
- #include <vector>
- #include <algorithm>
- typedef long long ll;
- using namespace std;
- int main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
-
- vector<int> originalQueue, sortedQueue;
- ll num, cnum = 0;
- ll temp, ans;
- bool bol = 0, judge;
- cin >> num;
- for (ll i = 0; i < num; i++) {
- cin >> temp;
- if (temp == 1) {
- cin >> temp;
- originalQueue.push_back(temp);
-
- // 将新插入的元素插入到有序队列的合适位置
- auto it = lower_bound(sortedQueue.begin(), sortedQueue.end(), temp);
- sortedQueue.insert(it, temp);
-
- } else if (temp == 2) {
- cout << sortedQueue.front() << endl;
-
- // 从原始队列和有序队列中删除队首元素
- originalQueue.erase(originalQueue.begin());
- sortedQueue.erase(sortedQueue.begin());
-
- cnum += 1;
-
- } else if (temp == 3 && ans != 3) {
- // 无需对整个队列进行排序,只需重新确定有序队列的元素顺序
- sort(sortedQueue.begin(), sortedQueue.end());
- }
- ans = temp;
- }
- for (ll i = 0; i < cnum; i++) {
- cout << sortedQueue[i] << endl;
- }
-
- return 0;
- }
复制代码
这样做的话,每次执行操作2时只需要从有序队列的队首取出元素即可,时间复杂度为O(1),而操作3的时间复杂度也为O(nlogn),但是由于操作3不是连续执行的,所以整体的时间复杂度会得到极大的优化。
希望可以帮助到你!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|