PTA 栈 (20分)(全网首发)(实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))
題目描述:
我們知道平凡的棧有幾個操作:
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 了就不管了,應該多看看別人的解法。
總結
以上是生活随笔為你收集整理的PTA 栈 (20分)(全网首发)(实现一个栈Stack,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法竞赛入门经典(第二版) | 例题4-
- 下一篇: 被忽略的知识点——switch语句