测试:
`public class MaxInWindows {
public static void main(String[] args) {
int[] i={2,3,4,2,6,2,5,1};
int a=3;
ArrayList<Integer> list = Solution1.maxInWindows(i, a);
System.out.println(list);
}
}
题解:
class Solution {
public static ArrayList<Integer> maxInWindows(int [] num, int size) {
if(num==null||size==0||num.length<size) return null;
MonotonicQueue window = new MonotonicQueue();
ArrayList<Integer> res = new ArrayList<>();
for (int i = 0; i < num.length; i++) {
if (i < size - 1) {
//先填满窗口的前 size - 1
window.push(num[i]);
} else {
// 窗口向前滑动,加入新数字
window.push(num[i]);
// 记录当前窗口的最大值
res.add(window.max());
// 移出旧数字
window.pop(num[i - size + 1]);
}
}
return res;
}
}
/* 单调队列的实现 */
class MonotonicQueue {
LinkedList<Integer> q = new LinkedList<>();
public void push(int n) {
// 将小于 n 的元素全部删除
while (!q.isEmpty() && q.getLast() < n) {
//删除列表的最后一个元素,如果列表为空,返回null
Integer integer = q.pollLast();
System.out.println(integer);
}
// 然后将 n 加入尾部
q.addLast(n);
}
public int max() {
return q.getFirst();
}
public void pop(int n) {
if (n == q.getFirst()) {
q.pollFirst();
}
}
}
原文:https://www.cnblogs.com/pangwan/p/14617654.html