编程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

原文地址:https://www.cnblogs.com/xlzfdddd/p/10026371.html

时间: 2024-08-02 11:48:34

编程7:生成窗口最大值数组的相关文章

生成窗口最大值数组

1.生成窗口最大值数组 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置. 例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时: [4 3 5] 4 3 3 6 7 窗口中最大值为5 4 [3 5 4] 3 3 6 7 窗口中最大值为5 4 3 [5 4 3] 3 6 7 窗口中最大值为5 4 3 5 [4 3 3] 6 7 窗口中最大值为4 4 3 5 4 [3 3 6] 7 窗口中最大值为6 4 3 5 4 3 [3 6 7] 窗口中最大

5.生成窗口最大值数组

题设:给一个整型数组arr和一个大小为w的窗口,窗口从最左边滑到最右边,窗口每次向右边滑一个位置,例如arr={4,3,5,4,3,6,7}时,w=3,此时生成的窗口最大值数组为{5,5,5,6,7}. 思路:给定一个长度为L的数组arr ,当滑动窗口大小 为w时,则生成的窗口最大值数组maxWindow长度为L-w+1,;用一个双端队列queue(可以用LinkedList来模拟)来存储滑动窗口的最大值,假设当窗口移动到位置i时,当queue为空时直接将i添加到queue的队尾,当queue不

[程序员代码面试指南]栈和队列-生成窗口最大值数组(双端队列)

问题描述 输入数组arr={4,3,5,4,3,3,6,7},窗口大小w=3,窗口由左向右移动,输出每个窗口最大值组成的数组. 解题思路 数据结构:使用ArrayList模拟双端队列. 遍历一遍arr,时间复杂度O(n).具体地, 队列队尾的位置对应的元素若不比当前位置对应元素大,则弹出,否则,将当前元素入队. -每次检查队首元素下标是否已超出以当前位置为结尾的窗口,超出则出队. 代码 import java.util.LinkedList; public class Main { public

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

题目描述: 有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次向右滑动一个位置. 比如 : 给定数组[4 3 5 4 3 3 6 7] [4 3 5 ]4 3 3 6 7       ----------- 窗口中最大值为5 4[ 3 5 4] 3 3 6 7     ----------- 窗口中最大值为5 4 3 [5 4 3] 3 6 7     ----------- 窗口中最大值为5 4 3 5 [4 3  3]  6 7   ----------- 窗口中最大

剑指offer--滑动窗口最大值

滑动窗口最大值 题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1

滑动窗口最大值的golang实现

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1

56 java编程思想——创建窗口和程序片 用户接口API

56.java编程思想--创建窗口和程序片 用户接口API Java 1.1 版同样增加了一些重要的新功能,包括焦点遍历,桌面色彩访问,打印"沙箱内"及早期的剪贴板支持. 焦点遍历十分的简单,因为它显然存在于AWT 库里的组件并且我们不必为使它工作而去做任何事.如果我们制造我们自己组件并且想使它们去处理焦点遍历,我们过载isFocusTraversable()以使它返回真值.如果我们想在一个鼠标单击上捕捉键盘焦点,我们可以捕捉鼠标按下事件并且调用requestFocus()需求焦点方法

52 java编程思想——创建窗口和程序片 程序片限制

52.java编程思想--创建窗口和程序片 程序片限制 出于安全缘故,程序片十分受到限制,并且有很多的事我们都不能做.您一般会问:程序片看起来能做什么,传闻它又能做什么:扩展浏览器中WEB 页的功能.自从作为一个网上冲浪者,我们从未真正想了解是否一个WEB 页来自友好的或者不友好的站点,我们想要一些可以安全地行动的代码.所以我们可能会注意到大量的限制: (1) 一个程序片不能接触到本地的磁盘.这意味着不能在本地磁盘上写和读,我们不想一个程序片通过WEB页面阅读和传送重要的信息.写是被禁止的,当然

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置|最大值 -|- [1 3 -1] -3 5