* 数组arr与整数w,w从左往右划,求每次窗口内的最大值,并返回结果数组
* 思路:
* 1 一个双端队列辅助,存储数组下标
* 2 右边界滑动,弹出所有小于、等于新入元素的数
* 3 左边界滑动,对头过期
* 4 队列首元素一定是最大元素
<?php
function getWindowMaxArray($array, $w)
{
$array_size = count($array);
// 边界条件
if ($array_size < $w || !$array || $w <1) {
return null;
}
$max_index = new SplDoublyLinkedList();
$results = [];
$index = 0;
// 一次循环遍历
for ($i = 0; $i < $array_size; $i++) {
//右边界滑动
while (!$max_index->isEmpty() && $array[$max_index->offsetGet($max_index->count()-1)] <= $array[$i]) {
//弹出尾部元素
$max_index->pop();
}
$max_index->push($i);
//左边界滑动
if ($max_index->offsetGet(0) == $i - $w) {
//头部移除元素
$max_index->shift();
}
//窗口大小满足w才开始计数
if ($i >= $w -1) {
$results[$index++] = $array[$max_index->offsetGet(0)];
}
}
return $results;
}
$array = [9,1,2,3,4,6];
$w = 4;
var_dump(getWindowMaxArray($array, $w));