得到栈中所含最小元素的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)的时间复杂度得到当前栈的最小元素,但是当当前最小元素弹出时,获得次小元素比较麻烦
因此,可以引入一个辅助栈,存储这样的数据:其栈顶存储的是当前最小元素,当最小元素弹出时,其栈顶元素弹出,下一个栈顶元素是次小元素
原始栈正常入栈,辅助栈为空时元素入栈,否则,如果原始栈入栈元素比辅助栈栈顶元素小,则入栈
出栈时,如果两个栈栈顶元素相等,则都出栈
因为原始栈中当前栈中最小元素之后入栈的元素都比最小值小,所以在最小元素未弹出之前,辅助栈栈顶始终是当前栈最小元素
查看15道真题和解析