假设一个固定大小为W的窗口,
依次划过arr返回每一次滑出状况的最大值例如,
arr= [4,3,5,4,3,3,6,71, W = 3
返回:[5,5,5,4,6,7]
/**
* //arr 代表初始数组(1,5,2,7,3,8)
* //w 代表滑动窗口的大小(w = 3)
* @param arr
* @param w
* @return
*/
public static int[] getMaxWindow(int[] arr, int w) {
if (arr == null || w < 1 || arr.length < w) {
return null;
}
// qmax其中放的是位置,arr[位置]
//约束:位置所代表的值是从大到小的
LinkedList<Integer> qmax = new LinkedList<Integer>();
//一共可以形成多少个值(arr.length - w + 1)
int[] res = new int[arr.length - w + 1];
int index = 0;
for (int i = 0; i < arr.length; i++) { // 当前让 i -> [i] 进窗口 , i 就是 r
//1、进窗口的逻辑
//队列不为空,且当前i位置的值大于该队列尾部元素值,那么就从队列中弹出
while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[i]) {
qmax.pollLast();
}
//最后该位置加入到队列,该队列依然保持是从大到小排序的
qmax.addLast(i);
//2、出窗口的逻辑
//(i - w)就是过期的位置
if (qmax.peekFirst() == i - w) {
qmax.pollFirst();
}
//窗口没有形成w长度之前,是不会弹出元素的
if (i >= w - 1) {
res[index++] = arr[qmax.peekFirst()];
}
}
return res;
}