Design a stack-like data structure to push elements to the stack and pop the most frequent element from the stack.
Implement the
-
FreqStack() constructs an empty frequency stack. -
void push(int val) pushes an integerval onto the top of the stack. -
int pop() removes and returns the most frequent element in the stack.- If there is a tie for the most frequent element, the element closest to the stack's top is removed and returned.
[[], [5], [7], [5], [7], [4], [5], [], [], [], []]
Output: [null, null, null, null, null, null, null, 5, 7, 5, 4]
Explanation:
FreqStack freqStack = new FreqStack();
freqStack.push(5); // The stack is [5]
freqStack.push(7); // The stack is [5,7]
freqStack.push(5); // The stack is [5,7,5]
freqStack.push(7); // The stack is [5,7,5,7]
freqStack.push(4); // The stack is [5,7,5,7,4]
freqStack.push(5); // The stack is [5,7,5,7,4,5]
freqStack.pop(); // return 5, as 5 is the most frequent. The stack becomes [5,7,5,7,4].
freqStack.pop(); // return 7, as 5 and 7 is the most frequent, but 7 is closest to the top.
//The stack becomes [5,7,5,4].
freqStack.pop(); // return 5, as 5 is the most frequent. The stack becomes [5,7,4].
freqStack.pop(); // return 4, as 4, 5 and 7 is the most frequent, but 4 is closest to the top.
//The stack becomes [5,7].
Constraints:
0 <= val <= 109 - At most
2 * 104 calls will be made topush andpop . - It is guaranteed that there will be at least one element in the stack before calling
pop .
Contents
Solution 1 - Using a Stack
As per the problem statement, we will have to create a stack that returns maximum frequency element, this can be achieved by using a
So, in this approach we are going use a
Say is
-
When the 1st element 5 is pushed, it's frequency is 1, so we will add it to the map under frequency 1 as key
[ 1 -> 5] -
Then when the 2nd element 5 is pushed, now the frequency of
5 becomes 2, so we will add it under frequency 2 as key[[ 1 -> (5)], [ 2 -> (5)]] . -
Similarly when we next elements map will look likes this
[[ 1 -> (5,7)], [ 2 -> (5,7)], [ 3 -> (5)]] . -
Now, if we have to pop the max frequency element, we will pop the element with frequency 3, that is 5, and the map now looks like this
[[ 1 -> (5,7)], [ 2 -> (5,7)]] . -
Now we have a tie, there are two elements,
5 and7 , out of these two 7 pushed as last element, so we can pop the top element from the stack under the key 2, then the map looks like this[[ 1 -> (5,7)], [ 2 -> (5)]] . - Now the max frequency is still 2, and if we have to pop the next max frequency element, then we can pop the top element from the stack under key 2.
For this implementation, we are also going to use another
Complexity Analysis:
Time complexity: Time complexity for the solution will be O(n) where
Space complexity: O(n) for storing elements into stack.
Above implementations source code can be found at