class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length == 1) {
return nums;
}
LinkedList<Integer> queue = new LinkedList<>();
int[] res = new int[nums.length - k + 1];
int index = 0;
for (int i = 0; i < nums.length; i++) {
while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) {
queue.pollLast();
}
queue.add(i);
if (queue.peekLast() - k == queue.peek()) {
queue.poll();
}
if (i + 1 >= k) {
res[index++] = nums[queue.peek()];
}
}
return res;
}
}
共以下 5 个回答
看题解了
使用双端队列保存可能的最大值的下标。
遍历:当前元素(下标对应值)大于队列尾元素(下标对应值),将该队尾元素出队,循环;
当队列头元素不在窗口内了,将该队头元素出队;
保存当前窗口最大值(对头元素对应值);