zoukankan      html  css  js  c++  java
  • 8.最大滑动窗口问题

      题设:有一个整型数组arr和一个大小为w的窗口,窗口从数组的最左边滑到最右边,窗口每次向右边滑动一个位置。列如数组arr为[4,3,5,4,3,3,6,7],当窗口w大小为3时,滑动过程如下图:

    如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口最大值,请实现一个函数。

    分析:

      本题可以用一个双端队列queue来模拟一个窗口,queue中存储数组值对应的下标,则实现该函数的时间复杂度为O(N);

      比如从arr[i]开始滑动,如果此时queue为空,则可直接将i添加到队列queue中,如果此时queue的队尾元素大于arr[i],则将i直接添加到queue的队尾,反之则弹出queue的队尾元素,继续比较arr[i]与queue最新的队尾元素,直到queue最新的队尾元素大于arr[i]或者queue为空时,将i添加到queue的队尾。此时如果queue队头元素等于i-w时则弹出当前的队头元素,因为此时队头元素已经无效。这样当滑动到数组最后一个元素时,数组中的下标只进入或弹出队列一次,所以时间复杂度为O(N)。

    附如下代码:

    public static int[] getMaxWindow(int[] arr,int w){
            if(arr.length<w||arr==null||w<1){
                return null;
            }
            int[] result=new int[arr.length-w+1];
            LinkedList<Integer> queue=new LinkedList<>();
            for(int i=0;i<arr.length;i++){
                while(!queue.isEmpty()&&arr[queue.peekLast()]<arr[i]){
                    queue.removeLast();
                }
                queue.addLast(i);
                if(queue.peekFirst()==i-w){
                    queue.removeFirst();
                }
                if(i>=w-1){
                    result[i-w+1]=arr[queue.peekFirst()];
                }
            }
            return result;
        }
  • 相关阅读:
    交互式输入编辑与历史命令补全
    string模板
    textwrap——文本包裹和填充模块解析
    python质量控制
    命令自动补全模块rlcomplete
    密码输入模块getpass
    交互模式启动配置文件
    pprint模块解析
    python基础知识--2字符串
    python基础知识--1注释
  • 原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10372379.html
Copyright © 2011-2022 走看看