Tuesday, June 4, 2019

LeetCode [895] Maximum Frequency Stack

Implement FreqStack, a class which simulates the operation of a stack-like data structure.
FreqStack has two functions:
  • push(int x), which pushes an integer x 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 that 0 <= 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 exceed 10000 in a single test case.
  • The total number of FreqStack.pop calls will not exceed 10000 in a single test case.
  • The total number of FreqStack.push and FreqStack.pop calls will not exceed 150000 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