题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
package offer;
import java.util.ArrayDeque;
import java.util.ArrayList;
public class Solution59 {
public ArrayList<Integer> maxInWindows(int[] num, int size) {
ArrayList<Integer> list = new ArrayList<>();
if (num.length == 0 || num == null || num.length < size || size < 1)
return list;
ArrayDeque<Integer> index = new ArrayDeque<>();
// 遍历0~size范围内
for (int i = 0; i < size; i++) {
// 若队尾下标对应的数字小于待存入的数据,那么它不可能是最大值,将其删除
while (!index.isEmpty() && num[i] >= num[index.peekLast()])
index.pollLast();
index.addLast(i);
}
// 遍历size~length范围内
for (int i = size; i < num.length; i++) {
list.add(num[index.peekFirst()]);
// 若队尾下标对应的数字小于待存入的数据,那么它不可能是最大值,将其删除
while (!index.isEmpty() && num[i] >= num[index.peekLast()])
index.pollLast();
// 如果滑动窗口已经不包含队首下标对应的值,删除队首元素
if (!index.isEmpty() && index.peekFirst() <= (i - size))
index.pollFirst();
index.addLast(i);
}
list.add(num[index.peekFirst()]);
return list;
}
}