Question : Get Minimum element in O(1) from Input Numbers or Stack
– With any traditional way we can’t get minimum element in O(1)
– so we need to come up with different data structure.
– As its very old and famous question We are directly explaining logic
Logic 1)
Keep Two Stacks A and B.
A will contain all numbers which are input by users.
B will contain only minimum number from all input numbers.
ex. Input 10,20,5,30,2
Consider the following input A B (minimum elements) 2 --> TOP 2 ... 30 5 ... 5 5 (smallest in 10,20,5 input) 20 10 (smallest in 10,20 input) 10 10 (smallest at beginning)
Pros
– storing minimum element for each input.
– if current minimum element is popped , we still have minimum element in present stack
Cons
– O(n) Extra Space.
Code :
#include<iostream>
#include<stdlib.h>
using namespace std;
class Stack
{
private:
static const int max = 100;
int arr[max];
int top;
public:
Stack() { top = -1; }
bool isEmpty();
bool isFull();
int pop();
void push(int x);
};
bool Stack::isEmpty()
{
if(top == -1)
return true;
return false;
}
bool Stack::isFull()
{
if(top == max - 1)
return true;
return false;
}
int Stack::pop()
{
if(isEmpty())
{
cout<<"Stack Underflow";
abort();
}
int x = arr[top];
top--;
return x;
}
void Stack::push(int x)
{
if(isFull())
{
cout<<"Stack Overflow";
abort();
}
top++;
arr[top] = x;
}
//Stack
class SpecialStack: public Stack
{
Stack min;
public:
int pop();
void push(int x);
int getMin();
};
void SpecialStack::push(int x)
{
if(isEmpty()==true)
{
Stack::push(x);
min.push(x);
}
else
{
Stack::push(x);
int y = min.pop();
min.push(y);
if( x < y )
min.push(x);
else
min.push(y);
}
}
int SpecialStack::pop()
{
int x = Stack::pop();
min.pop();
return x;
}
int SpecialStack::getMin()
{
int x = min.pop();
min.push(x);
return x;
}
int main()
{
SpecialStack s;
s.push(10);
s.push(5);
s.push(20);
s.push(30);
cout<<s.getMin()<<endl;
s.push(1);
cout<<s.getMin();
return 0;
}
C Working Code : Find here : http://ideone.com/qOtFoG
C++ Working code : Find here : http://ideone.com/mgtTQY
Logic 2)
To Get Minimum element in O(1) from Input or Stack, Instead of keeping a stack of minimum elements in B, we can optimism the space complexity for above solution with single minimum number.
Consider the following input A B (minimum elements) 2 --> TOP 30 5 2 20 5 10 10 (smallest at beginning)
If You pop from A, Pop from B (min elem stack as well) and both’s data is not matching, Push B’s top element to B.
Consider sequence
Pop A. So popped element from A is 2, and B’s popped element is 2. so now min element is for now on is 5.
Pop A, So popped element from A is 30 and B’s popped element is 5, both are not matching, so push 5 to B again. so in B elements are 5,10 and will be min element.
Code :
In above C++ code, change these two methods Push and Pop
void SpecialStack::push(int x)
{
if(isEmpty()==true){
Stack::push(x);
min.push(x);
}
else {
Stack::push(x);
int y = min.pop();
min.push(y);
if( x <= y )
min.push(x);
}
}
int SpecialStack::pop()
{
int x = Stack::pop();
int y = min.pop();
if ( y != x )
min.push(y);
return x;
}