维护O(1)时间查找最大元素的栈

来源:互联网 发布:大学刷题软件 编辑:程序博客网 时间:2024/06/02 03:40
问题描述:一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。可修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂度无要求。


创建一个类,类里有两个栈,一个栈S1维持正常的push、pop操作,另一个S2保存当前的最大值。

其实我觉得理解好题目是非常重要的,求最大值,想来想去无论怎么样时间复杂度也得为O(n)吧,但是题目并不是这个意思,而是在已有的操作上,进行一步操作,就可以得到最大值。那么这就好做了。

S1:1  2  5  4  3  2  9

S2:5  9

进栈的元素时候如果为比S2的栈顶要大,则为最大值,同时push S1 and S2。否则,只进栈S1(S1为原始栈)。

同样,出栈的时候,直接检查S2和S1的是否相同,是的话,直接出栈,S2的栈顶必为最大值。这道题目可以改为最小值,只需要把判断符号改一下即可。


见下面代码:

strcut find_max{stack<int> s1;stack<int> s2;};find_max s;void redefine_push(int k){if(!s.s1.empty()){if(k>s.s2.push())s.s1.push();s.s2.push();}else{s.s1.push();s.s2.push();}}void redefine_pop(){if(!s.s1.empty()){if(s.s1.top()==s.s2.top())s.s2.pop();s.s1.pop();}}int max_stack(){if(!s.s1.empty())return s.s2.redfine_pop();}


0 0
原创粉丝点击