239. Sliding Window Maximum 滑动窗口最大值
这一题也是滑动窗口类型的题目,严格来说比上一篇的滑动窗口中位数要来的简单,滑动窗口中位数则需要两个堆来解决,而这一次我们只需要用一个双向队列即可。 在这个队列中我们存储的并不是数组中的值,而是存储的值的索引,在向双向队列尾部添加索引的时候,要将队列中所有比该索引对应的值小的缩影都移除,这样就可以保证队列的前端永远是该滑动窗口中的最大值。来让我们看看代码吧
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
// 空情况
if(nums == null || nums.length == 0)return new int[0];
int[] res = new int[nums.length-k+1];
//双向队列
LinkedList<Integer> dq = new LinkedList<>();
for(int i = 0;i < nums.length;i++){
//需要删除最左边的索引
if(!dq.isEmpty() && dq.peek() == i-k)dq.poll();
//移除所有小于当前索引对应值的索引
while(!dq.isEmpty() && nums[dq.peekLast()] < nums[i])dq.removeLast();
//添加当前的索引
dq.offer(i);
if(i+1 >= k) res[i-k+1]= nums[dq.peek()];
}
return res;
}
}