895. Maximum Frequency Stack
Description
Design a stack-like data structure to push elements to the stack and pop the most frequent element from the stack.
Implement the FreqStack
class:
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.
Example 1:
Input ["FreqStack", "push", "push", "push", "push", "push", "push", "pop", "pop", "pop", "pop"] [[], [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
.
Solutions
Solution: Hash Map
- Time complexity: O(1)
- Space complexity: O(n)
JavaScript
js
const FreqStack = function () {
this.maxFrequency = 0;
this.frequencyMap = new Map();
this.frequencies = [];
};
/**
* @param {number} val
* @return {void}
*/
FreqStack.prototype.push = function (val) {
const frequency = (this.frequencyMap.get(val) ?? 0) + 1;
this.frequencyMap.set(val, frequency);
if (!this.frequencies[frequency]) this.frequencies[frequency] = [];
this.frequencies[frequency].push(val);
this.maxFrequency = Math.max(frequency, this.maxFrequency);
};
/**
* @return {number}
*/
FreqStack.prototype.pop = function () {
const frequencies = this.frequencies[this.maxFrequency];
const value = frequencies.pop();
const frequency = this.frequencyMap.get(value);
this.frequencyMap.set(value, frequency - 1);
if (!frequencies.length) this.maxFrequency -= 1;
return value;
};
/**
* Your FreqStack object will be instantiated and called as such:
* var obj = new FreqStack()
* obj.push(val)
* var param_2 = obj.pop()
*/