DAY11

80 阅读3分钟

第五章 栈与队列part02

150. 逆波兰表达式求值

本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题

题目链接/文章讲解/视频讲解:programmercarl.com/0150.%E9%80…

239. 滑动窗口最大值 (有点难度,可能代码写不出来,但一刷至少需要理解思路)

之前讲的都是栈的应用,这次该是队列的应用了。

本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

题目链接/文章讲解/视频讲解:programmercarl.com/0239.%E6%BB…

347.前 K 个高频元素 (有点难度,可能代码写不出来,一刷至少需要理解思路)

大/小顶堆的应用, 在C++中就是优先级队列

本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。

题目链接/文章讲解/视频讲解:programmercarl.com/0347.%E5%89…

总结

栈与队列做一个总结吧,加油

programmercarl.com/%E6%A0%88%E…

笔记

逆波兰表达式求值
  1. 初始化

    • 创建一个空栈 stack 用于存储操作数。
  2. 遍历 tokens 数组

    • 对于每个 token(操作符或操作数):

      • 如果 token 是操作符(不是数字):

        • 从栈中弹出两个数字(注意弹出的顺序)。
        • 根据操作符进行相应的运算(+, -, *, /)。
        • 将计算结果推入栈中。
      • 如果 token 是数字:

        • 将其转换为数字类型,并推入栈中。
  3. 返回结果

    • 最后,栈中的唯一元素即为计算结果。
滑动窗口最大值

使用单调队列(Monotonic Queue)来有效地跟踪滑动窗口中的最大值。队列中的元素保持递减顺序,使得队列的前端始终是当前窗口中的最大值。

单调队列(Monotonic Queue)

定义一个类 MonoQueue,实现以下操作:

  • enqueue(index):将新元素的索引添加到队列中,确保队列保持递减顺序。
  • dequeue(index):移除滑出窗口的元素的索引。
  • front():返回队列前端索引对应的值,即当前窗口的最大值。
  1. 初始化

    • 创建一个 MonoQueue 实例 helperQueue
    • 初始化一个结果数组 resArr
    • 填充第一个长度为 k 的窗口,并将其最大值添加到 resArr 中。
  2. 滑动窗口

    • 从第 k 个元素开始,逐个滑动窗口:

      • 将当前元素的索引加入 helperQueue 中。
      • 移除滑出窗口的元素的索引(即 i - k)。
      • 将当前窗口的最大值添加到 resArr 中。
  3. 返回结果

    • 返回 resArr,它包含了每个窗口的最大值。
前K个高频元素

使用了 PriorityQueue 来维护一个小顶堆,从而找出数组中出现频率最高的 k 个元素。代码的思路很清晰,先使用 Map 统计每个元素出现的频率,然后通过优先队列(小顶堆)来保持最频繁的 k 个元素。

  1. 使用 Map 统计元素频率

    • 通过遍历数组 nums,将每个元素及其出现次数存入 Map
  2. 创建小顶堆

    • 使用小顶堆来存储频率最高的 k 个元素。在堆中,元素的频率越小,优先级越高(即小顶堆的堆顶是频率最小的元素)。
  3. 维护堆的大小

    • 当堆的大小超过 k 时,移除堆顶元素,保证堆中只存储前 k 个最频繁的元素。
  4. 输出结果

    • 将堆中剩余的元素从堆顶取出,得到频率最高的 k 个元素。