思路
个人理解 这个题目 总共分为四个步骤
- 判断是否队头需要出队—条件是长度超过K
- 判断队尾是否需要出队—条件是队尾的值大于遍历到的x
- 将遍历到的点 的索引 索引 索引 入队
- 如果窗口达到K之后 输出最大值 也就是 队头
import java.util.*;
import java.io.*;
public class Main{
static int N=1000010;
static int []a=new int [N];
static int []q=new int [N];
static int hh;
static int tt;
public static void main(String[]args)throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out));
String[]ps1=reader.readLine().split(" ");
int n=Integer.parseInt(ps1[0]);
int k=Integer.parseInt(ps1[1]);
String []ps2=reader.readLine().split(" ");
for(int i=0;i<n;i++){
a[i]=Integer.parseInt(ps2[i]);
}
hh=0;
tt=-1;
for(int i=0;i<n;i++){
//1看下是否队头出队?
while(hh<=tt&&i-q[hh]+1>k)hh++;
//2、看下 队尾是否需要出队
while(hh<=tt&&a[q[tt]]>=a[i])tt--;
//3、新的索引入队
q[++tt]=i;
//4、达到最大窗口的时候 开始输出最大值 或者是最小值
if(i-k+1>=0)writer.write(a[q[hh]]+" ");
}
writer.write("\n");
hh=0;
tt=-1;
for(int i=0;i<n;i++){
while(hh<=tt&&i-q[hh]+1>k)hh++;
while(hh<=tt&&a[q[tt]]<=a[i])tt--;
q[++tt]=i;
if(i-k+1>=0)writer.write(a[q[hh]]+" ");
}
writer.flush();
}
}a