Day13 栈和队列part03

本文深入讲解栈和队列数据结构的应用,重点解析滑动窗口最大值及前K个高频元素问题,采用大根堆和单调队列优化算法,探讨栈与队列在内存中的分布特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十三天 栈和队列part03

LC239滑动窗口最大值(未掌握

  1. 暴力解法:使用大根堆,每次加入一个end数据删除一个start数据,随后start++,end++,但是会超时
  2. 代码
    在这里插入图片描述
  3. 使用单调队列:
    • 队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。
      • 滑动窗口最大值:单调队列的队头值
      • 可能成为窗口中的最大值(主要解决如何弹出元素的问题,原本的解决方案中往往会超时):
        • 入队元素大于队尾元素,队尾元素出队直到队尾元素小于等于入队元素,否则入队元素队尾入队
        • 移除元素:只有当移除的元素等于队头元素才移除元素
    • 注意:未指定queue的类型的时候默认使用Deque
      在这里插入图片描述
  4. 代码
    在这里插入图片描述

LC347前K个高频元素(超时10min)

  1. 思路:利用HashMap统计词频,利用Set获取key和PriorityQueue构建大根堆根据词频排序
    • PriorityQueue的构建不是很熟练:new Comparator<>(){public int compare(){}}
    • 获取HashMap的key集:Set set = map.keySet()
  2. 代码:
    在这里插入图片描述

栈和队列的总结

  1. 面试题:栈里面的元素在内存中是连续分布的吗
    • 栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
      • 栈,队列不归类为容器,往往被归类为容器适配器。栈的底层实现可以是 vector,deque,list 都可以,主要就是数组和链表的底层实现。
    • 缺省情况下,默认底层容器是deque,deque在内存中的数据分布是不连续的
  2. 经典未掌握题目
    • 用队列实现栈:一个栈用来存放元素,一个元素用来备份元素
    • 括号匹配:使用一个栈的简洁写法,遇见左括号直接入栈右括号,遇见右括号直接出栈对应右括号
    • 中缀后缀表达式求值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值