经典结构 窗口最大值更新结构

内容:

1、窗口内最大值更新结构

2、窗口移动

3、求达标的子数组个数

1、窗口内最大值更新结构

窗口:数组中的一系列数

  • L与R之间的数就是窗口内的数 
  • L和R的初始位置为数组的左边,可表示为-1
  • L和R都只能右移,不可后退;且L不可超过R

窗口内最大值更新结构实质上就是一个双端队列(双向链表实现),可以从头部放入数据、弹出数据,也可以从尾部放入数据、弹出数据(均是O(1))

双端队列中每个元素由value和index组成,value是值,index是时间戳(数组下标)

双向队列加数策略:R右移,则向双向队列中加数;如果尾部元素比要加入的数小,则弹出尾部的数,一直弹,

直到尾部的数大于新加入的数,或者队列为空。

解释:如果新加入的数据,比之前的数大,那么之前的数就不可能是窗口内最大值,可以舍弃掉。

双向队列减数策略: L右移,则需要处理,如果刚被移出窗口的数是队列头部的数则把队列头部的数弹出,这就是为什么要保存数组下标的原因

窗口内最小值类似:双向队列从头到尾依次递增,加数如果尾部数比要加的数大则弹出,减数也是过期就弹出;

  

2、窗口移动

3、求达标的子数组个数

猜你喜欢

转载自www.cnblogs.com/wyb666/p/10276317.html