别看这道题水了吧唧, 但作者只给了600ms的运行时间,
第一重循环肯定是N--,
但找最小值的操作,用输入一次判断一次的方法行不通, 因为他会有弹出的操作,当保存最小值时,如果弹出的是该值, 那么我们找不到第二小的。
因此就只能遍历,但这样时间复杂度就变成了n²,一定运行超时。我真的想不到更简化的方法了,各清位大佬们支支招。谢谢!
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std ;
int main()
{
ios::sync_with_stdio(false);
int n, x;
cin >> n;
string a;
vector<int>v;
bool flag = false;
while(n--) {
cin >> a;
if(a[1] == 'u') { cin >> x; v.push_back(x); }
else if(a[1] == 'o') v.pop_back();
else {
int minValue = *min_element(v.begin(),v.end()); //最小范围的定义数。
cout << minValue << endl;
}
}
return 0;
}
###运行结果:
本人也是个菜鸟
由于数据范围没有给全,以下代码仅供参考,没有用C++的东西
#include <stdio.h>
int num[1000000];
int tot = 0, min, pos;
int getmin() {
int min = num[0];
int i;
for(i = 0; i < tot; i++) {
if(num[i] < min) {
min = num[i];
}
}
return min;
}
int main() {
int n, i;
scanf("%d", &n);
char op[3];
for(i = 0; i < n; i++) {
scanf("%s", &op);
if(op[1] == 'u') {
scanf("%d", &num[tot]);
if(tot) {
if(min > num[tot]) {
min = num[tot];
pos = tot;
}
} else {
min = num[tot];
pos = tot;
}
tot++;
continue;
}
if(op[1] == 'o') {
tot--;
num[tot] = 0;
min = getmin();
continue;
}
if(op[1] = 'i') {
printf("%d\n", min);
continue;
}
}
return 0;
}
用最小堆来做,栈里存储值的同时存储其在最小堆里的位置,弹出的时候将堆末元素和该元素互换然后维护堆结构。
弹出和插入过程由于每次堆基本有序,复杂度在O(n)。
堆用结构体数组模拟,val是正常栈压入的值,left,right对应其在最小堆中的关系
struct node{
node *left, *right;
int val;
}
20号有空再给你写程序。另外请附题目出处连接,我去测试程序