一个大小为k的滑动窗口,从前向后在数组nums上移动,返回滑动窗口每移动一次时,求窗口中的最大值。
输入:[2, 4, -2, -4, 3, 1, 5],k=4。
public class SlidingWindowTest {
static class MyQueue{
LinkedList<Integer> que = new LinkedList<>();
int front(){
return que.getFirst();
}
void pop(int value){
//弹出滑动中被舍弃的元素
if (!que.isEmpty()&&front()==value) {
que.pop();
}
}
void push(int value){
//构建单调递减队列
while (!que.isEmpty()&&que.getLast()<value){
que.pollLast();
}
que.offer(value);
}
}
static List<Integer> maxSlidingWindow(int[] arr,int k){
MyQueue myQueue = new MyQueue();
for (int i = 0; i < k; i++) {
myQueue.push(arr[i]);
}
List<Integer> result = new ArrayList<>();
result.add(myQueue.front());
for (int i = k; i < arr.length; i++) {
//滑动窗口舍弃最左侧元素
myQueue.pop(arr[i-k]);
myQueue.push(arr[i]);
result.add(myQueue.front());
}
return result;
}
public static void main(String[] args) {
System.out.println(maxSlidingWindow(new int[]{2, 4, -2, -4, 3, 1, 5}, 4));
}
}