得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
包含min函数的栈
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&tqId=11173&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
class Solution { public: void push(int value) { stack1.push(value); if(stack2.empty()) stack2.push(value); else if(value<=stack2.top()) stack2.push(value); } void pop() { if(stack1.top()==stack2.top()) stack2.pop(); stack1.pop(); } int top() { return stack1.top(); } int min() { return stack2.top(); } stack<int> stack1; stack<int> stack2; };
一开始应该想到定义一个变量存储当前栈中的最小元素,这样就可以以O(1)的时间复杂度得到当前栈的最小元素,但是当当前最小元素弹出时,获得次小元素比较麻烦
因此,可以引入一个辅助栈,存储这样的数据:其栈顶存储的是当前最小元素,当最小元素弹出时,其栈顶元素弹出,下一个栈顶元素是次小元素
原始栈正常入栈,辅助栈为空时元素入栈,否则,如果原始栈入栈元素比辅助栈栈顶元素小,则入栈
出栈时,如果两个栈栈顶元素相等,则都出栈
因为原始栈中当前栈中最小元素之后入栈的元素都比最小值小,所以在最小元素未弹出之前,辅助栈栈顶始终是当前栈最小元素