zoukankan      html  css  js  c++  java
  • 牛客网 滑动窗口的最大值

    题目:

    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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}, {2,3,4,2,6,[2,5,1]}。

    解题:

    import java.util.*;
    /**
     用一个双端队列,队列第一个位置保存当前窗口的最大值,当窗口滑动一次
     1.判断当前最大值是否过期
     2.新增加的值从队尾开始比较,把所有比他小的值丢掉
     */
    public class Solution {
        public ArrayList<Integer> maxInWindows(int [] num, int size)
        {
            ArrayList<Integer> res = new ArrayList<>();
            if(size == 0) return res;
            int begin;
            ArrayDeque<Integer> q = new ArrayDeque<>();//队列中存放的是数组下标,队列中存放的第一个元素是滑动窗口的最大值
            for(int i = 0; i < num.length; i++){
                begin = i - size + 1;//滑动窗口的开始下标
                if(q.isEmpty())
                    q.add(i);
                else if(begin > q.peekFirst())//如果队列中的第一个元素小于滑动窗口的开始下标,则说明滑动窗口不包含第一个元素,则将队列中的第一个元素取出
                    q.pollFirst();
                while((!q.isEmpty()) && num[q.peekLast()] <= num[i])//如果新加入的元素下标对应的数组值大于之前存储的,则将之前比他小的值移出
                    q.pollLast();//从尾部移出
                q.add(i);
                System.out.println("size:" + q.size()+ " " + q.peekFirst());
                if(begin >= 0)//大于0是,则说明滑动窗口内填满了元素
                    res.add(num[q.peekFirst()]);
            }
            return res;
        }
    }
  • 相关阅读:
    【HDOJ】2774 Shuffle
    【POJ】2170 Lattice Animals
    【POJ】1084 Square Destroyer
    【POJ】3523 The Morning after Halloween
    【POJ】3134 Power Calculus
    【Latex】如何在Latex中插入伪代码 —— clrscode3e
    【HDOJ】4801 Pocket Cube 的几种解法和优化
    【HDOJ】4080 Stammering Aliens
    【HDOJ】1800 Flying to the Mars
    SQL语法
  • 原文地址:https://www.cnblogs.com/yanhowever/p/12311121.html
Copyright © 2011-2022 走看看