题目描述:
我们知道平凡的栈有几个操作:
push(value) 将 value 压入栈 pop() 将栈顶元素弹出, 并返回这个弹出的元素。
现在我们想要在平凡栈的基础上实现以下几个操作:
push(val) 将 val 压入栈;
pop() 将栈顶元素弹出;
min() 返回栈中元素的最小值。
输入格式:
第一行输入一个N( 0=<N<=1000000),代表有N行操作。 接下来N行每行有一个操作,题目保证操作不会越界.
输出格式:
输出每次查询min()时的结果,pop()不用输出
输入样例:
6
push 1
min
push 2
min
push 3
min
输出样例:
1
1
1
分析:
全网首发啊有木有-_-||,这道PTA题其实是一道经典面试题的改编版,本题要求输入小于100W种操作,时间限制在600ms,这就要求我们只能用O(n)或O(nlogn)去实现,毋庸置疑遍历n种操作的循环必须有,所以就要求最小值时的复杂度为o(1),由此引出一个经典思想:空间换时间。下面给出代码:
代码:
#include<iostream>
#include<stdio.h>
int a[1000005], b[1000005]; //a是存放所有值的,b是存放小值的 ,从1开始存放
int main() {
int num1 = 0, num2 = 0; //a、b数组的计数器 ,0代表无存放
int n;
scanf("%d", &n);
while(n--) {
char s[5];
scanf("%s", &s);
if(s[1] == 'u') {
int x;
scanf("%d", &x);
if(!num1) {
a[++num1] = x; b[++num2] = x;
} else {
a[++num1] = x;
if(x <= b[num2]) b[++num2] = x;
}
} else if(s[1] == 'o') {
if(a[num1] == b[num2]) { a[num1--] = 0; b[num2--] = 0; }
else a[num1--] = 0;
} else printf("%d\n", b[num2]);
}
return 0; }
二更:
有评论反应代码无法运行, 已做调整。 无法运行的原因是:
代码中a,b数组的规模都开到了100w, 而规模50w以上的数组就要定义为全局变量, 否则会报错。
收获:
1、空间换时间的思想
2、C语言比C++要高效一些
每日分享:
平时在做题的时候,一定要寻找最优解,而不是 ac 了就不管了,应该多看看别人的解法。