class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int[] ans = new int[nums.length-k+1];
Deque<Integer> queue = new LinkedList<>();
int ans_index=0;
for(int i=0;i<nums.length;i++){
while(!queue.isEmpty() && nums[i]>=nums[queue.getLast()])
queue.removeLast();
queue.addLast(i);
while(!queue.isEmpty() && i-queue.getFirst()>=k)
queue.removeFirst();
if(i>=k-1){
ans[ans_index] = nums[queue.getFirst()];
ans_index++;
}
}
return ans;
}
}
题解:
1.维护一个单调队列,保证队列从右到左是递减排列,且队头元素是滑动窗口中最大的值(的索引)。
2.**新值入队:**在新的值入队时,把单调队列中比它小的值全部移除,因为这些值不可能是最大值了,移除之后添加进新的值。
3.**旧值出队:**添加进新的值之后,判断队首元素是不是还在滑动窗口中,如果不满足就出队。
4.把队首元素(滑动窗口中的最大值)放到答案队列中。
数据结构:
队列
Deque<Integer> queue = new LinkedList<>();
用到方法:
LinkedList 继承 List 接口(特有方法):
addFirst(); addLast(); 添加元素
getFirst(); getLast(); 获取元素但不删除
removeFirst(); removeLast(); 获取并且删除
jkd1.6中出现了替代方法
offerFirst(); offerLast(); 添加元素
peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null