13-滑动窗口、单调栈结构

1-滑动窗口问题

1.1窗口最大值最小值的更新结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBQbkpnPw,size_20,color_FFFFFF,t_70,g_se,x_16

左边界右边界都往右边动不可以往左边动;左边界不可以超过右边界。

解决办法:双端队列:头尾都可以进出队列。

双端队列内部的排序是按照头->尾是按照大->小的排列。双端队列里放的是数组的下标,不放具体的数。

窗口R滑动的时候:如果窗口活动的时候不能保证单调性,那么队列中的数据要一个一个的从队尾弹出,弹出的数据永不找回,弹出到新的数据加入进去之后满足单调性。

窗口L滑动的时候:L滑动完之后判断一下L是否让双端队列的头部节点过期了(L也是个int类型数据)即此时窗口不包括头部节点的位置了,如果过期则让头部节点弹出。

双端队列维持的是信息是:如果目前的窗口不再扩了,而是选择让L依次往右扩,谁会依次成为最大值的优先级信息。为什么R扩充的时候需要维持单调性?因为此时被弹出的数据再也没有可能成为最大值了。即已经不是双端队列要维持的信息了。

单词更新的时间复杂度尾O(1)

2-单调栈

例子:给出一个数组,求出数组上每一个位置左边、右边离他最近比他大(小)的位置

设置一个单调栈,例如求大的时候,栈底到栈顶是由大到小,放的也是数组的下标,但不满足下标要弹出的时候,弹出数的信息生成:最边离你最近比你大的数是你压着的数,右边比你大离你最近的数是当前要入栈的数。

如果数组中无重复值:

 如果遍历完数组,栈里面还有东西,那么右边比这些数据大的无,左边大的就是下面压着的数据 

如果有重复值:

栈中放的是存放下标的链表,栈保持单调性,如果当前数加进来不能保持单调性,那么对弹出数右边离你最近比你大的值是当前数,左边离你最近比你大的数是你压着链表的最后一个数

 2.1题目(假设是正数数组)

假设每一个数都必须是他所在子数组的最小值,可能有很多子数组都达标,选择累加和最大的哪一个,然后去求指标——用单调栈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值