双端队列来做。维持大小顺序,然后每次要取值的时候看维持的头节点是否过期,过期了就需要弹出。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(k == 0 || nums == null){
return new int[]{};
}
int[] res = new int[nums.length - k + 1];
Deque<Integer> queue = new LinkedList();
for(int r = 0;r < nums.length; r++){
if(queue.isEmpty() || nums[r] < nums[queue.peekLast()]){
queue.addLast(r);
}else{
while(!queue.isEmpty() && nums[r] >= nums[queue.peekLast()] ){
queue.pollLast();
}
queue.addLast(r);
}
if(queue.peekFirst() <= r - k){
queue.removeFirst();
}
if(r-k >= -1){
res[r-k+1] = nums[queue.getFirst()];
}
}
return res;
}
}