代码随想录day12 逆波兰表达式求值 | 滑动窗口最大值 | 前 K 个高频元素
逆波兰表达式求值
解题思路
使用堆栈数据结构,把数存进栈,当遇到运算符号的时候,弹出堆栈顶两个数,得到运算结果后再压入堆栈
知识点
堆栈
心得
这个很像编译原理中如何编译数字和运算符号的内容,也当作是一种复习了。
滑动窗口最大值
解题思路
这道题采用了一个单调队列,这个队列有着独特的压入和弹出时机,也是这道题的难点,即如何控制队列的压入和弹出。当滑动窗口移到下一个时,查找队列底部的值是否为被移除的值(即那个不在下一个滑动窗口的值)。而新的值则和之前队列的值进行比较,如果新的值大,则弹出队列尾部保存的值,如此循环直到遇到小于新的值的元素。在移动到下一个滑动窗口之前,队列的尾部就是当前滑动窗口的最大值
知识点
滑动窗口,队列,单调队列
心得
难,第一次做根本想不到这个逻辑。
前 K 个高频元素
解题思路
用哈希表得到每个数的出现频率,随后将哈希表的结果放入优先级队列进行排序,使用优先级队列的好处是不需要处理全部的元素,只需要处理k个元素即可。优先级队列使用的是小顶堆,即完全二叉树的每个父节点的值都小于等于其左右子节点,因为本题需要找到的是前k个重复频率最高的,采用小顶堆无需遍历所有频率,时间复杂度更低。
知识点
哈希表,优先级队列,大顶堆,小顶堆
心得
第一次在C++中使用priority_queue这个数据结构,还不太熟悉它的用法,得好好补习。