题目
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。
题解
使用双向队列,存储数组最大值的下标,这样可以方便判断是否在滑动窗口内,并使得队列中的下标所对应的数是按照从大到小顺序排列,代码如下
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
if (nums == null || n == 0 || k <= 1) return nums;
int size = n - k + 1;
int[] res = new int[size];
Deque<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
//使得队列维持从大到小的顺序
while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) {
queue.pollLast();
}
queue.offerLast(i);
//移除不在窗口内的
if (queue.peekFirst() <= i - k) {
queue.pollFirst();
}
if (i + 1 >= k) {
res[i + 1 - k] = nums[queue.peekFirst()];
}
}
return res;
}