队列

15 阅读1分钟

1. 滑动窗口

  • 双端队列/动态窗口

双端队列最常用的地方就是实现一个长度动态变化的窗口或者连续区间,而动态窗口这种数据结构在很多题目里都有运用。可以通过双向链表实现双端队列。

  • 单调队列

类似于单调栈。以单增队列为例,从队列头到队列尾的元素是严格递增
添加元素e到队尾时,需要先检查e是否大于队尾元素,如果是则直接加入队尾,否则不断从队尾删除大于等于e的元素

1.1 滑动窗口最大值

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        Deque<Integer> deque = new LinkedList<Integer>();
        int[] res = new int[n-k+1];
        int cnt = 0;

        for(int i=1-k,j=0;j<n;j++,i++){
            if(i>0 && deque.getFirst()==nums[i-1]) deque.removeFirst();
            while(!deque.isEmpty() && deque.getLast()<nums[j]) deque.removeLast();
            deque.addLast(nums[j]);
            if(i >= 0) res[cnt++] = deque.getFirst(); 
        }

        return res;
    }
}