class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length * k == 0)
return new int[0];
Deque<Integer> index = new ArrayDeque<>();
int[] res = new int[nums.length -k + 1];
for (int i = 0; i < nums.length; i++) {
int x = nums[i];
// 如果小于窗口左界,移出
if (i >= k && index.peek() <= i - k)
index.removeFirst();
// 如果队列里的值小于x,从右依次移出
while (!index.isEmpty() && nums[index.peekLast()] <= x)
index.removeLast();
index.add(i);
if (i >= k-1)
res[i-k+1] = nums[index.peek()];
}
return res;
}
}
注:
考察的是双端队列。在滑动过程中维护一个双端队列。需要注意移出时是从右往左逐个移出。