双端队列
1.双端队列的概念:
普通队列是可以队首删除元素,队尾添加元素。对于双端队列,在队首、队尾都可以进行入队和出队的操作。
- 在一端进行出队和入队的操作,就有点类似栈的意思了,后入先出
- 也存在受限的双端队列:
一端可以入队、出队操作,另一端只能进行入队操作;
一端可以入队、出队操作,另一端只能进行出队操作。
2.双端队列的基本操作:
LeetCode 239: 滑动窗口最大值
⭕️ 解题思路:
(1)创建一个结果集数组,大小为nums.length - k + 1
(2)创建一个双端队列,保存放到队列中的元素的索引。
(3)判断当前最大值是否还在滑动窗口中,如果已经不再窗口中了,要将这个元素的索引从队首弹出
(4)将窗口中的最大值保存到结果集数组中
⭕️ 代码部分:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//特殊情况处理
if(nums == null || nums.length < 2){
return nums;
}
//结果集数组
int [] res = new int [nums.length - k + 1];
//用双端队列来保存数组索引
LinkedList<Integer> queue = new LinkedList();
//遍历数组
for(int i = 0; i < nums.length; i++){
//如果队列不为空,当前对内元素小于下一个入队的元素,那么弹出队内的元素
while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
queue.pollLast();
}
//将当前元素的索引入队
queue.addLast(i);
//判断队列中的值是否有效
if(queue.peek() <= i - k){
queue.poll();
}
//将滑块中的最大值保存到结果集中,主要控制好第一个录入的元素即可
if(i + 1 >= k){
res[i - k + 1] = nums[queue.peek()];
}
}
return res;
}
}