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

    package Solutions;
    import java.util.ArrayDeque;
    import java.util.ArrayList;
    /**
    * Created by hu on 2015/12/6.
    */
    /*
    *题目描述
    给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
    例如,如果输入数组{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]}。
    * */
    public class solution25 {
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
    //存放最终结果的list
    ArrayList<Integer> arrayList=new ArrayList<Integer>();
    ArrayDeque<Integer> deque = new ArrayDeque<Integer>();
    //首先初始化队列,队列存储的是元素的下标,其顺序按照对应的元素从大到小排列
    if (size==0){
    return arrayList;
    }
    //滑动窗口的起始位置
    int begin;
    for (int i=0;i<num.length;i++){
    //i代表的是滑动窗口中最后一个元素的下标
    begin=i-size+1;
    if(deque.isEmpty()){
    deque.add(i);
    }else if(begin>deque.peekFirst()){
    //如果最大值过期了,就将最大值去除掉,因为每次只移动一个格子,所以最多有一个元素过期,因此只判断一次
    deque.pollFirst();
    }
    //将队列中小于新添加元素的下坐标都删除掉
    while ((!deque.isEmpty())&&num[deque.peekLast()]<=num[i]){
    deque.pollLast();
    }
    deque.add(i);
    if(begin>=0){
    arrayList.add(num[deque.peekFirst()]);
    }
    }
    return arrayList;
    }
    }
  • 相关阅读:
    1052. 爱生气的书店老板
    766. 托普利茨矩阵
    643.子数组的最大平均数I
    450. 删除二叉搜索树中的节点
    1489.找到最小生成树里的关键边和伪关键边
    839相似字符串
    1631.最小体力消耗路径
    SnowFlake雪花算法源码分析&灵活改造,常见分布式ID生成解决方案
    【目标检测】三、Faster R-CNN与R-FCN
    【目标检测】二、Fast R-CNN与SVD
  • 原文地址:https://www.cnblogs.com/hujingwei/p/5023561.html
Copyright © 2011-2022 走看看