Implement
FreqStack
, a class which simulates the operation of a stack-like data structure.FreqStack
has two functions:push(int x)
, which pushes an integerx
onto the stack.pop()
, which removes and returns the most frequent element in the stack.- If there is a tie for most frequent element, the element closest to the top of the stack 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: After making six .push operations, the stack is [5,7,5,7,4,5] from bottom to top. Then: pop() -> returns 5, as 5 is the most frequent. The stack becomes [5,7,5,7,4]. pop() -> returns 7, as 5 and 7 is the most frequent, but 7 is closest to the top. The stack becomes [5,7,5,4]. pop() -> returns 5. The stack becomes [5,7,4]. pop() -> returns 4. The stack becomes [5,7].
Note:
- Calls to
FreqStack.push(int x)
will be such that0 <= x <= 10^9
. - It is guaranteed that
FreqStack.pop()
won't be called if the stack has zero elements. - The total number of
FreqStack.push
calls will not exceed10000
in a single test case. - The total number of
FreqStack.pop
calls will not exceed10000
in a single test case. - The total number of
FreqStack.push
andFreqStack.pop
calls will not exceed150000
across all test cases.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | struct Ele{ int value; int index; int count; Ele(int v, int i, int c):value(v),index(i),count(c){} }; struct Comp { bool operator()(const Ele& lhs, const Ele& rhs) { if (lhs.count<rhs.count) return true; if (lhs.count==rhs.count) return lhs.index<rhs.index; return false; } }; class FreqStack { priority_queue<Ele, vector<Ele>, Comp> pq; int index = 0; map<int, int> mp;//number, count public: FreqStack() { } void push(int x) { Ele e(x, index++, ++mp[x]); pq.push(e); } int pop() { int v = pq.top().value; pq.pop(); mp[v]--; return v; } }; /** * Your FreqStack object will be instantiated and called as such: * FreqStack* obj = new FreqStack(); * obj->push(x); * int param_2 = obj->pop(); */ |
No comments:
Post a Comment