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
.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class FreqStack { | |
public: | |
// keep each element's frequent | |
unordered_map<int, int> freq; | |
// keep each frequent's element as an order | |
unordered_map<int, stack<int>> group; | |
// keap max frequent | |
int maxfreq; | |
FreqStack() { | |
maxfreq = 0; | |
} | |
void push(int val) { | |
// update frequent of value | |
int f = freq[val] + 1; | |
freq[val] = f; | |
// update max frequent if needed | |
if(f > maxfreq) | |
maxfreq = f; | |
// freq: [v1, v2, v3] as stack | |
group[f].push(val); | |
} | |
int pop() { | |
// maxfreq's top val | |
int x = group[maxfreq].top(); group[maxfreq].pop(); | |
// decrease frequent | |
freq[x] = freq[x] - 1; | |
if(group[maxfreq].size() == 0) | |
maxfreq--; | |
return x; | |
} | |
}; | |
/** | |
* Your FreqStack object will be instantiated and called as such: | |
* FreqStack* obj = new FreqStack(); | |
* obj->push(val); | |
* int param_2 = obj->pop(); | |
*/ |
No comments:
Post a Comment