从最小(大)栈到最大(小)队列,再到单调队列

本文总结了最小栈问题、队列最大值问题及其解决方案——单调队列。通过分析问题特点,利用两个栈实现最小栈,两个队列解决队列最大值问题,确保操作平均时间复杂度为O(1)。单调队列在此基础上有更广泛的应用,如滑动窗口最大值等。

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

引言

很长一段时间没有写博客,也没有刷 leetcode 了。这两天又刷了一下,发现还是生疏了不少。做 239. 滑动窗口最大值 的时候,发现有用单调队列的做法,突然想起了 剑指 Offer 59 - II. 队列的最大值 可不就是单调队列嘛。所以和最大(小)栈问题一起,做个总结记录以备查看。

最小栈问题

简单说明一下最小栈问题:设计一个栈结构,可以支持栈原有的push, pop,top 操作,同时加入 min 操作可以返回当前栈的最小值。
问题分析: 原本栈是一个单进单出的结构,先进后出。要求返回栈的最小值,那是需要每次都来个全体出栈,比较,再入栈的过程吗?答案当然是不,这样的做法复杂度太高了。那既然要保持原有栈的出栈入栈等功能,还要记录最小值。一个栈不行,那就两个!用两个栈结构,一个保存 push 操作放当前最小值,一个push按原本的操作。
上栗子:155. 最小栈

class MinStack {
   
public:
    stack<int> normalStack;	// 正常操作栈
    stack<int> minStack;	// 最小值操作栈
    /** initialize your data structure here. */
    MinStack() {
   
	    //
    }
    
    void push(int x) {
   
        normalStack.push(x);	// 常规插入
        //	比较当前插入值和栈顶值,取小值进行 push 
        if(minStack.empty()) minStack.push(x);	
        else minStack.push(min(x, minStack.top()));
    }
    
    void pop() {
   
    	// pop 操作两个都不要做额外的操作
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值