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;
        }
    }
  • 相关阅读:
    DEDECMS里面DEDE函数解析
    dede数据库类使用方法 $dsql
    DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
    织梦DedeCms网站更换域名后文章图片路径批量修改
    DSP using MATLAB 示例 Example3.12
    DSP using MATLAB 示例 Example3.11
    DSP using MATLAB 示例 Example3.10
    DSP using MATLAB 示例Example3.9
    DSP using MATLAB 示例Example3.8
    DSP using MATLAB 示例Example3.7
  • 原文地址:https://www.cnblogs.com/yanhowever/p/12311121.html
Copyright © 2011-2022 走看看