* 數組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));