力扣239.滑动窗口最大值(单调队列)
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ans = new int[n - k + 1];
//单调队列,右边维护最大值,每次进来一个新的数,和队列最后一个数进行比较,保证队列从左向右单调递减
//左边维护窗口大小,队列记录位置,如果超出窗口大小从左边出队
Deque<Integer> q = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
while (!q.isEmpty() && nums[q.getLast()] <= nums[i]) {
q.removeLast();
}
q.addLast(i);
int left = i - k + 1;
if (q.getFirst() < left) {
q.removeFirst();
}
if (left >= 0) {
ans[left] = nums[q.getFirst()];
}
}
return ans;
}
}

浙公网安备 33010602011771号