zoukankan      html  css  js  c++  java
  • 双端队列解决窗口滑动问题

    package queue;

    import java.util.ArrayDeque;
    import java.util.Deque;

    class SildeWindow{

    public int[] getMax(Integer[] data,int window ) {
    Deque<Integer> deque=new ArrayDeque<Integer>();
    int[] res=new int[data.length-window+1];//res记录窗口的最大值
    int j=0; //res的下标
    //遍历数组
    for(int i=0;i<data.length;i++) {
    //第一个窗口入队w-1个数
    if(i<window-1){
    deque.push(i);
    }else {
    //窗口的最后一个数据(还没还有入队),比队尾(first端)元素大,让队尾出队
    while(!deque.isEmpty()&&data[i]>data[deque.peekFirst()]) {
    deque.pollLast();
    }
    //判断队列头(last端)元素是否过期(即在窗口外面),如果过期就出队
    if(!deque.isEmpty()&&deque.peekLast()<i+1-window) {
    deque.pollLast();
    }
    //以上操作之后 让窗口的最后一个数据入队
    deque.push(i);
    //此时队列的last是窗口最大值
    res[j++]=data[deque.peekLast()];
    }
    }
    return res;
    }
    }
    public class MoveWindow {

    public static void main(String[] args) {
    Integer[] data=new Integer[] {4,3,5,4,3,3,6,7};
    int window=3;
    SildeWindow sw=new SildeWindow();
    int[] res=sw.getMax(data,window);
    for(int i:res) {
    System.out.println(i);
    }
    }

    }

  • 相关阅读:
    端口以及服务常用cmd
    异步,同步,阻塞,非阻塞,并行,并发,
    mysql启动不起来
    安装nagios出现的错误
    Linux内核优化
    mysql使用常见问题
    mysql日志
    mysql数据库使用脚本实现分库备份过程
    mysqladmin常用用法
    mysql授权
  • 原文地址:https://www.cnblogs.com/smailjunk/p/8934529.html
Copyright © 2011-2022 走看看