zoukankan      html  css  js  c++  java
  • 栈和队列----生成窗口的最大值数组

    生成窗口的最大值数组 

      

      给定一个n个元素的整型数组arr,和一个大小为w的窗口,从数组的最左边移动到最右边,每次移动一个单位,一共产生n-w+1个窗口的最大值数组。

      例如数组为[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 ]  窗口中最大值为7

      要求实现一个函数,输入为整型数组arr,窗口大小为w,输出为一个长度为 n-w+1 的数组res,res[i]表示每一种窗口状态下的最大值。以本题为例,结果应该返回[5,5,5,4,6,7]

     

    package com.test;
    
    import java.util.LinkedList;
    
    /**
     * Created by Demrystv.
     */
    public class GetMaxWindow {
        public int[] getMaxWindow(int[] arr,int w){
            if (arr.length<w || w<1 || arr==null){
                return null;
            }
    
            //双端队列qmax存放的是数组arr中的下标
            LinkedList<Integer> qmax = new LinkedList<Integer>();
            int[] res = new int[arr.length - w + 1];
            int index = 0;
    
            //qmax的放入规则是:
            // 如果qmax为空,则直接将下标i 放入,该过程结束
            // 如果qmax不为空,则取出当前qmax队尾元素的下标,记为j
            //     如果arr[j]>arr[i],则将i放入qmax的队尾
            //     如果arr[j]<=arr[i],则将j从qmax中弹出
            //qmax的弹出规则是:
            // qmax的队头下标等于i-w,说明已经过期,将其弹出
            for (int i=0; i<arr.length; i++){
                while (!qmax.isEmpty() && arr[qmax.peekLast()]<=arr[i]){
                    qmax.pollLast();
                }
                qmax.addLast(i);
                if (qmax.peekFirst() == i-w){
                    qmax.pollFirst();
                }
                if(i>=w-1){
                    res[index++] = arr[qmax.peekFirst()];
                }
            }
            return res;
        }
    }
  • 相关阅读:
    Sql Server截断日志(转)
    C#/VB.NET语法的比较(转)
    ReportViewer矩阵报表
    逐步学习 iPhone App 开发(1)
    一月二十四日,无家可归
    再见2009
    poj 1376 机器人广搜
    hdu 1004 颜色问题
    hdu 2734 简单地字符串处理
    1116 贪婪的送礼者
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9292813.html
Copyright © 2011-2022 走看看