[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 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.
最大频率栈。
设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
实现 FreqStack 类:
FreqStack() 构造一个空的堆栈。
void push(int val) 将一个整数 val 压入栈顶。
int pop() 删除并返回堆栈中出现频率最高的元素。
如果出现频率最高的元素不只一个,则移除并返回最接近栈顶的元素。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-frequency-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这是一道设计题。题意说的很明白了,我直接给思路。这里我需要
- 变量max,记录全局最多的出现次数是多少
- Hashmap<Integer, Integer> freq - 记录每个元素的出现次数
- HashMap<Integer, Stack<Integer>> map - 记录相同出现次数都有哪些元素,存在stack里面
当我们做push操作的时候,正常更新freq哈希表中每个不同元素的出现次数;对于map哈希表,我们也将当前push的这个元素放入他对应的出现次数背后的那个stack中。
当我们做pop操作的时候,正常更新freq哈希表中每个不同元素的出现次数;对于map哈希表,注意因为题目要求pop()函数弹出出现次数最多的元素,所以我们肯定是从map.get(max)这个key背后的stack中弹出元素。注意如果做完pop操作之后这个stack为空了,需要将max--。
时间O(1)
空间O(n)
Java实现
1 class FreqStack { 2 // 记录元素的出现次数 3 HashMap<Integer, Integer> freq; 4 // 记录相同出现次数都有哪些元素,用stack存 5 HashMap<Integer, Stack<Integer>> map; 6 int max; 7 8 public FreqStack() { 9 freq = new HashMap<>(); 10 map = new HashMap<>(); 11 max = 0; 12 } 13 14 public void push(int val) { 15 int f = freq.getOrDefault(val, 0) + 1; 16 freq.put(val, f); 17 max = Math.max(max, f); 18 if (!map.containsKey(f)) { 19 map.put(f, new Stack<>()); 20 } 21 map.get(f).push(val); 22 } 23 24 public int pop() { 25 int x = map.get(max).pop(); 26 freq.put(x, max - 1); 27 if (map.get(max).size() == 0) { 28 max--; 29 } 30 return x; 31 } 32 } 33 34 /** 35 * Your FreqStack object will be instantiated and called as such: 36 * FreqStack obj = new FreqStack(); 37 * obj.push(val); 38 * int param_2 = obj.pop(); 39 */