剑指 Offer(力扣版)-59-II-队列的最大值

本文介绍了如何设计一个队列数据结构,支持入队、出队和查询最大值操作,并且能在O(1)时间内完成。通过维护一个单调递减的双端队列,可以轻松实现这些操作。在入队时,从队尾开始更新队列,出队时处理队头,查询最大值则直接返回队头元素。文章特别强调了在处理过程中需要注意的三个关键点,避免出现错误。
摘要由CSDN通过智能技术生成

题目链接

题意:

定义一个新队列数据结构,支持入队,出队,查询三种操作,可以快速O(1)时间内查找队中最大值

思路:

在队列中添加一个链表,用于维护当前队列最大值,该链表指向该最大值出队后剩余列表的最大值。于是,每次最大元素出队时,该链表后移,即可找到下一个最大值,这样,出队和查询都变得异常简单,那么接下来就需要考虑一下入队构造这个链表的操作。

对于空队,显然,入队的值即为最大值。

接下来,如果入队的新元素比最大值大,则之前的最大值可以直接舍弃,新元素为最大值。反正,需要将新元素连到最大值的后方,当最大值出队时该元素即成为新的最大值。

不难发现,这样维护下来的链表是一个单调递减的链,因为每次链的前一个节点出队后,后一个节点才成为最大值,因此前一个节点一定比后一个节点大。

于是,每次入队操作即可总结为:从链尾开始向前遍历链,对于所有小的节点全都舍弃,然后将新节点接在末尾。

为了方便操作,用双向链表来实现这个数据结构,front和back模拟队首和队尾,p和pb模拟链头和链尾

该题有以下三大个坑点:

1.判断队中最大值操作和出队操作前需要提前判断队是否为空

2.当出队操作完成时若队空,需要将所有指针都清空

3.出队后,若出队元素为最大元素,将指针后移后需将移出的指针断链

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值