import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
public class Ch1_Deque {
public static int[] slidingWindowMax(int[] arr,int k){
Deque<Integer> deque = new ArrayDeque<Integer>();
int[] result = new int[arr.length - k + 1];
for(int i=0;i<arr.length;i++){
//I.维持一个单调递减队列
while(!deque.isEmpty() && arr[i] > arr[deque.getLast()]){
deque.removeLast();
}
//II.添加元素到队尾
deque.add(i);
//III.超过滑动窗口则移除队首元素
if(deque.getFirst() == i-k){
deque.removeFirst();
}
//IV.保存结果
if(i >= k-1){
result[i+1-k] = arr[deque.getFirst()];
}
}
return result;
}
public static int slidingWindowMaxGap(int[] arr,int k){
Deque<Integer> max = new ArrayDeque<Integer>();
Deque<Integer> min = new ArrayDeque<Integer>();
int result = 0;
for(int i=0;i<arr.length;i++){
//最大值
while(!max.isEmpty() && arr[i] > arr[max.getLast()]){
max.removeLast();
}
max.add(i);
if(max.getFirst() == i-k){
max.removeFirst();
}
//最小值
while(!min.isEmpty() && arr[i] < arr[min.getLast()]){
min.removeLast();
}
min.add(i);
if(min.getFirst() == i-k){
min.removeFirst();
}
//IV.保存结果
if(i >= k-1){
result = Math.max(result, arr[max.getFirst()] - arr[min.getFirst()]);
}
}
return result;
}
public static void main(String[] args) {
int []arr = new int[]{4,3,5,4,3,3,6,7,5,6,1};
System.out.println(Arrays.toString(slidingWindowMax(arr,3)));
System.out.println(slidingWindowMaxGap(arr,3));
}
}