算法2-生成窗口最大值數組

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章