• LeetCode每日一题——895. 最大频率栈


    LeetCode每日一题系列

    题目:895. 最大频率栈
    难度:困难



    题目

    设计一个类似堆栈的数据结构,将元素推入堆栈,并从堆栈中弹出出现频率最高的元素。

    实现 FreqStack 类:

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

    示例

    输入:

    [“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 之前堆栈中至少有一个元素。

    思路

    哈希表+栈应用

    1. 首先定义一个cnts哈希表记录每一个值出现的频数
    2. 再定义一个map哈希表记录每个频数所对应所有的数字,值为栈类型,也就是说越靠后的元素为栈顶
    3. 定义变量mv记录为当前最大频数值,可以发现mv是一直+1或者-1变化的
    4. push时就按照上述每个变量的含义来添加,pop时找到map中对应mv这个频数的栈顶元素抛出即可,注意cnts数组对应的频数也要减一,并且视情况对mv做+1或者-1或不变的操作

    题解

    class FreqStack:
    	# 定义所需的三个变量
        def __init__(self):
            self.cnts = defaultdict(int)
            self.map = defaultdict(list)
            self.mv = 0
    	# 按照规则添加并更新对应元素
        def push(self, val: int) -> None:
            self.cnts[val] += 1
            c = self.cnts[val]
            self.map[c].append(val)
            self.mv = max(self.mv, c)
    	# 抛出元素,并更新相关变量
        def pop(self) -> int:
            ans = self.map[self.mv].pop()
            self.cnts[ans] -= 1
            self.mv -= 0 if self.map[self.mv] else 1
            return ans
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    PAT数字&字符串处理
    上周热点回顾(5.1-5.7)
    记录错误 Method com/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Z is abstract
    Windows电脑画面如何投屏到电视?怎样限定投屏内容?
    Unity之"诡异"的协程
    三道MySQL联合索引面试题,你能答对几道?
    [树上倍增]Eezie and Pie 2022牛客多校第6场 B
    Java常用的设计模式
    自己搭设开源密码管理工具 bitwarden
    【Unity2022】Unity实现在两个物体之间连出一条线
  • 原文地址:https://blog.csdn.net/m0_52000372/article/details/128112910