题目一:队列的最大值:给定一个数组和滑动窗口大小,请查找出所有滑动窗口的最大值
方法:设置两端开口队列存储窗口最大值的下标;每个队头是这个窗口当前最大值;
窗口滑动时;新元素进队,把队里比它小的就删掉
名称 deque 是“double ended queue(双端队列)”的缩写
ArrayList<Integer> MaxInWindows1(int[] num, int size){ ArrayList<Integer> list = new ArrayList<Integer>(); ArrayDeque<Integer> q = new ArrayDeque<Integer>(); if(num == null || size <= 0) return list; //循环遍历数组,往队列中添加数组下标 for(int i=0; i <num.length; i++){ if(q.isEmpty()){ q.add(i); } //当前处理的数字的下标与队列中第一个元素相差大于等于滑动窗口的大小时 if(i - q.peekFirst() >= size){ q.pollFirst(); //从队列中弹出第一个元素 } //当前处理的数字比队列中最后一个元素下标对应的数字大 while(!q.isEmpty() && num[i] >= num[q.peekLast()]){ q.pollLast(); //从队列中弹出最后一个元素 } q.add(i); //队列中添加的是数组的下标 //第一个最大值开始把队列中元素下标对应的数字添加进 list if(i >= size-1){ list.add(num[q.peekFirst()]); } } return list; }
原文:https://www.cnblogs.com/niliuxiaocheng/p/12593391.html