原题链接:239. 滑动窗口最大值 – 力扣(LeetCode)
这一题主要是固定滑动窗口,但是主要的难点就是在窗口内寻找最大值,如果用普通的依次搜索可以做,但是时间复杂度为O(n^2)
根据题目特性,可以采用双端队列,因为滑动窗口有进和出,且分布在两侧,刚好符合条件。
本题可以得出滑动窗口的一些标准的模板,看着还不错。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] ans = new int[n - k + 1];
//deque里面存下标比较好,由下标得对应数据很容易,但由数据得下标不方便
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
//入,维持从左到右递减序列 5 3 1
while (!deque.isEmpty() && nums[deque.getLast()] <= nums[i]) {
deque.removeLast();
}
deque.add(i);
//出,窗口已经划过当前队列记录的最大值对应下标,如k=3,i=3,first = 0,需要将0退出
if (i - deque.getFirst() >= k) {
deque.pollFirst();
}
//保存结果
if (i - k + 1 >= 0) {
ans[i - k + 1] = nums[deque.getFirst()];
}
}
return ans;
}
}