编程7:生成窗口最大值数组

Posted xlzfdddd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程7:生成窗口最大值数组相关的知识,希望对你有一定的参考价值。

<?php
header("content-type:text/html;charset=utf-8");
/*
 *生成窗口的最大值数组 P19
 * 注意SplDoublyLinkedList的使用!!!
 * top指的是生成链表的尾部!!!
 * bottom指的是生成链表的头部!!!
 */

function getMaxwindow($arr,$w){
    if(count($arr)<$w){
        return 0;
    }
    $qMax = new SplDoublyLinkedList();
    $res = array();
    $index = 0;
    for($i=0;$i<count($arr);$i++){
        while (! $qMax->isEmpty() && $arr[$i] >= $arr[$qMax->top()]){  //遍历到数组i位置时,从队尾开始依次进行比较,若比队列元素大,就让队列元素从队尾弹出
            $qMax->pop();
        }
        $qMax->push($i);   //否则就将这个比较大的元素的下标加进队尾
        //处理队头元素过期,就将对头弹出

        if($qMax->bottom() == $i-$w){   //这里注意一下

            $qMax->shift();   //移除队列头部元素
        }

        //处理返回的数组,当数组遍历到和串口一般大小就开始记录,之后就一直记录
        if($i>= $w-1){
            $res[$index++] = $arr[$qMax->bottom()] ;
        }

    }

    return $res;

}

$arr = array(4,3,5,4,3,3,6,7);
$window = 3;
$res = getMaxwindow($arr,$window);
print_r($res);
echo "</br>";
//结果:Array ( [0] => 5 [1] => 5 [2] => 5 [3] => 4 [4] => 6 [5] => 7 )
$a = new SplDoublyLinkedList();
$a->push(1);
$a->push(2);
$a->push(3);
$a->push(4);
print_r($a);
//结果:SplDoublyLinkedList Object ( [flags:SplDoublyLinkedList:private] => 0 [dllist:SplDoublyLinkedList:private] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )
echo $a->top();
//结果:4
echo $a->bottom();
//结果: 1

 

以上是关于编程7:生成窗口最大值数组的主要内容,如果未能解决你的问题,请参考以下文章

5.生成窗口最大值数组

生成窗口最大值数组

算法实战生成窗口最大值数组

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

生成窗口最大值数组

左神带你刷题之生成窗口最大值数值