Orion's Studio.

算法(46)- 前K个高频元素

2024/03/19

一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序了。

在系统中的应用

递归的实现是栈:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中。

括号匹配问题

  • 第一种情况,字符串里左方向的括号多余了,所以不匹配。
  • 第二种情况,括号没有多余,但是括号的类型没有匹配上。
  • 第三种情况,字符串里右方向的括号多余了,所以不匹配。

字符串去重问题

思路就是可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了。

逆波兰表达式问题

本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程。

队列

滑动窗口最大值问题

主要思想是队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。

那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来一个单调队列

而且不要以为实现的单调队列就是 对窗口里面的数进行排序,如果排序的话,那和优先级队列又有什么区别了呢。

求前 K 个高频元素

优先级队列,就是一个披着队列外衣的堆。

堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子的值。

使用优先级队列来对部分频率进行排序。

总结

我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。

接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。

通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。

CATALOG
  1. 1.
    1. 1.1. 在系统中的应用
    2. 1.2. 括号匹配问题
    3. 1.3. 字符串去重问题
    4. 1.4. 逆波兰表达式问题
  2. 2. 队列
    1. 2.1. 滑动窗口最大值问题
    2. 2.2. 求前 K 个高频元素
  3. 3. 总结