895. 最大频率栈(难度:困难)

手机软件开发 2024-9-30 08:51:27 9 0 来自 中国
标题链接:https://leetcode.cn/problems/maximum-frequency-stack/
标题形貌:

筹划一个类似堆栈的数据布局,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。
实现 FreqStack 类:

  • FreqStack() 构造一个空的堆栈。
  • void push(int val) 将一个整数 val 压入栈顶。
  • int pop()删除并返回堆栈中出现频率最高的元素。

    • 假如出现频率最高的元素不光一个,则移除并返回最靠近栈顶的元素。

示例 1:
输入:["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"],[[],[5],[7],[5],[7],[4],[5],[],[],[],[]]输出:[null,null,null,null,null,null,null,5,7,5,4]表明:FreqStack = new FreqStack();freqStack.push (5);//堆栈为 [5]freqStack.push (7);//堆栈是 [5,7]freqStack.push (5);//堆栈是 [5,7,5]freqStack.push (7);//堆栈是 [5,7,5,7]freqStack.push (4);//堆栈是 [5,7,5,7,4]freqStack.push (5);//堆栈是 [5,7,5,7,4,5]freqStack.pop ();//返回 5 ,由于 5 出现频率最高。堆栈酿成 [5,7,5,7,4]。freqStack.pop ();//返回 7 ,由于 5 和 7 出现频率最高,但7最靠近顶部。堆栈酿成 [5,7,5,4]。freqStack.pop ();//返回 5 ,由于 5 出现频率最高。堆栈酿成 [5,7,4]。freqStack.pop ();//返回 4 ,由于 4, 5 和 7 出现频率最高,但 4 是最靠近顶部的。堆栈酿成 [5,7]。提示:

  • 0 <= val <= 109
  • push 和 pop 的操纵数不大于 2 * 104。
  • 输入包管在调用 pop 之前堆栈中至少有一个元素。
解法:

利用一个Map<Integer, Integer> map存放数字val对应出现的次数,利用LinkedList<Integer>[] st 存储出现N次,对应的数字聚集,利用 int max 来记载当前出现的最大次数。
push一个 val 时,先更新val的出现次数times =map.getOrDefault(val, 0) + 1,再在对应次数的st[times].add(val),更新当前最大出现次数max = Math.max(max, times)。
pop 最大出现次数且末了一个入栈的元素时,只必要取出result = st[max].removeLast() 就是必要出栈的元素,再将该元素出现次数 -1即可。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:53, Processed in 0.123218 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表