滑动窗口最大/小值更新结构
现在有一个数组arr,有两个指针L、R。初始时L、R都指向-1,L、R都只能向右滑动,且L不能超过R。请快速求出L到R中间的最大值。
创建一个双向队列,队列始终保持从大到小排列。当R向右滑动时,如果新加入窗口的数字大于双向队列头节点的数字,则从队列中弹出节点直到队列中即便添加新数字后也可以保持从大到小排列。队列中头节点的最大值就是窗口内的最大值。
假设存在数组arr[] = {3,4,2,6,5,0,1},arr的L、R窗口内部最大值的求解过程如下。
初始时,窗口的L与R指针都指向-1,双向队列为空。
R向右移动(R= 0),窗口内只有一个数3,双向队列中加入3,窗口内最大值就是3;
R继续向右移动,此时窗口内有两个数字3、4,4 > 3,双向队列内不能保持从大到小排列,将3弹出,将4压入队列。此时窗口内的最大值为4。
R继续右移,此时窗口内的数字有3、4、2,新的数字2小于4,可以直接加入队列。