How would you design a stack which, in addition to push and pop, has a function min which returns the minimum element? Push, pop and min should all operate in 0(1) time.
We use two stacks to implement this, where stk1 is used to store data, and stk2 is used to store the current minimum value in the stack. Initially, stk2 stores a very large value.
When we push an element x into the stack, we push x into stk1, and push min(x, stk2[-1]) into stk2.
When we pop an element from the stack, we pop the top elements of both stk1 and stk2.
When we want to get the top element in the current stack, we just need to return the top element of stk1.
When we want to get the minimum value in the current stack, we just need to return the top element of stk2.
For each operation, the time complexity is $O(1)$, and the space complexity is $O(n)$.
classMinStack:def__init__(self):""" initialize your data structure here. """self.s=[]self.mins=[inf]defpush(self,val:int)->None:self.s.append(val)self.mins.append(min(self.mins[-1],val))defpop(self)->None:self.s.pop()self.mins.pop()deftop(self)->int:returnself.s[-1]defgetMin(self)->int:returnself.mins[-1]# Your MinStack object will be instantiated and called as such:# obj = MinStack()# obj.push(val)# obj.pop()# param_3 = obj.top()# param_4 = obj.getMin()
classMinStack{privateDeque<Integer>stk1=newArrayDeque<>();privateDeque<Integer>stk2=newArrayDeque<>();/** initialize your data structure here. */publicMinStack(){stk2.push(Integer.MAX_VALUE);}publicvoidpush(intx){stk1.push(x);stk2.push(Math.min(x,stk2.peek()));}publicvoidpop(){stk1.pop();stk2.pop();}publicinttop(){returnstk1.peek();}publicintgetMin(){returnstk2.peek();}}/** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */
classMinStack{public:/** initialize your data structure here. */MinStack(){stk2.push(INT_MAX);}voidpush(intx){stk1.push(x);stk2.push(min(x,stk2.top()));}voidpop(){stk1.pop();stk2.pop();}inttop(){returnstk1.top();}intgetMin(){returnstk2.top();}private:stack<int>stk1;stack<int>stk2;};/** * Your MinStack object will be instantiated and called as such: * MinStack* obj = new MinStack(); * obj->push(x); * obj->pop(); * int param_3 = obj->top(); * int param_4 = obj->getMin(); */
typeMinStackstruct{stk1[]intstk2[]int}/** initialize your data structure here. */funcConstructor()MinStack{returnMinStack{[]int{},[]int{math.MaxInt32}}}func(this*MinStack)Push(xint){this.stk1=append(this.stk1,x)this.stk2=append(this.stk2,min(x,this.stk2[len(this.stk2)-1]))}func(this*MinStack)Pop(){this.stk1=this.stk1[:len(this.stk1)-1]this.stk2=this.stk2[:len(this.stk2)-1]}func(this*MinStack)Top()int{returnthis.stk1[len(this.stk1)-1]}func(this*MinStack)GetMin()int{returnthis.stk2[len(this.stk2)-1]}/** * Your MinStack object will be instantiated and called as such: * obj := Constructor(); * obj.Push(x); * obj.Pop(); * param_3 := obj.Top(); * param_4 := obj.GetMin(); */
classMinStack{stack:number[];mins:number[];constructor(){this.stack=[];this.mins=[];}push(x:number):void{this.stack.push(x);this.mins.push(Math.min(this.getMin(),x));}pop():void{this.stack.pop();this.mins.pop();}top():number{returnthis.stack[this.stack.length-1];}getMin():number{returnthis.mins.length==0?Infinity:this.mins[this.mins.length-1];}}/** * Your MinStack object will be instantiated and called as such: * var obj = new MinStack() * obj.push(x) * obj.pop() * var param_3 = obj.top() * var param_4 = obj.getMin() */
usestd::collections::VecDeque;structMinStack{stack:VecDeque<i32>,min_stack:VecDeque<i32>,}/** * `&self` means the method takes an immutable reference. * If you need a mutable reference, change it to `&mut self` instead. */implMinStack{/** initialize your data structure here. */fnnew()->Self{Self{stack:VecDeque::new(),min_stack:VecDeque::new(),}}fnpush(&mutself,x:i32){self.stack.push_back(x);ifself.min_stack.is_empty()||*self.min_stack.back().unwrap()>=x{self.min_stack.push_back(x);}}fnpop(&mutself){letval=self.stack.pop_back().unwrap();if*self.min_stack.back().unwrap()==val{self.min_stack.pop_back();}}fntop(&self)->i32{*self.stack.back().unwrap()}fnget_min(&self)->i32{*self.min_stack.back().unwrap()}}
publicclassMinStack{privateStack<int>stk1=newStack<int>();privateStack<int>stk2=newStack<int>();/** initialize your data structure here. */publicMinStack(){stk2.Push(int.MaxValue);}publicvoidPush(intx){stk1.Push(x);stk2.Push(Math.Min(x,GetMin()));}publicvoidPop(){stk1.Pop();stk2.Pop();}publicintTop(){returnstk1.Peek();}publicintGetMin(){returnstk2.Peek();}}/** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.Push(x); * obj.Pop(); * int param_3 = obj.Top(); * int param_4 = obj.GetMin(); */
classMinStack{privatevarstk1:[Int]privatevarstk2:[Int]init(){stk1=[]stk2=[Int.max]}funcpush(_x:Int){stk1.append(x)stk2.append(min(x,stk2.last!))}funcpop(){stk1.removeLast()stk2.removeLast()}functop()->Int{returnstk1.last!}funcgetMin()->Int{returnstk2.last!}}/** * Your MinStack object will be instantiated and called as such: * let obj = MinStack(); * obj.push(x); * obj.pop(); * let param_3 = obj.top(); * let param_4 = obj.getMin(); */