单调队列
什么是单调队列
说白了就是一个队列,但是队列满足单调的条件。
滑动窗口
在了解单调队列之前先看一道经典的单调队列问题——滑动窗口。
题意:
给定一个长度为n的数组,有一个长度为k的窗口从数组的左边滑向右边,每次滑动一格,求每次滑动窗口中的最大值和最小值。
输入输出示例:
输入:
8 3
1 3 -1 -3 5 3 6 7
输出:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
思路
暴力循环肯定也能解决问题,但是也肯定会超时,这时候就要用单调队列
单调队列实现
维护一个队列的数据结构,随着窗口的滑动,在满足队列单调性的情况下进行入队和出队操作。
即:假设维护一个单调递增的队列,通过扫描数组读入数组的值,用head指针和tail指针维护窗口队列的最大值和最小值,当读入的数组的值num[i]小于tail指向的值的时候,则将小于num[i]的值出队,再将num[i]入队,且如果head维护的值刚好被抛出时,将head指向下一个值。
具体代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String