-
Notifications
You must be signed in to change notification settings - Fork 99
/
Copy pathMaximumFrequencyStack895.java
82 lines (74 loc) · 2.46 KB
/
MaximumFrequencyStack895.java
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
* 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.
*/
public class MaximumFrequencyStack895 {
/**
* https://leetcode.com/problems/maximum-frequency-stack/solution/
*/
class FreqStack {
Map<Integer, Integer> freq;
Map<Integer, Stack<Integer>> group;
int maxfreq;
public FreqStack() {
freq = new HashMap();
group = new HashMap();
maxfreq = 0;
}
public void push(int x) {
int f = freq.getOrDefault(x, 0) + 1;
freq.put(x, f);
if (f > maxfreq)
maxfreq = f;
group.computeIfAbsent(f, z-> new Stack()).push(x);
}
public int pop() {
int x = group.get(maxfreq).pop();
freq.put(x, freq.get(x) - 1);
if (group.get(maxfreq).size() == 0)
maxfreq--;
return x;
}
}
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack obj = new FreqStack();
* obj.push(x);
* int param_2 = obj.pop();
*/
}