AcWing 154. 滑动窗口-java注释
原题链接
简单
作者:
OneDay1
,
2021-02-20 10:57:30
,
所有人可见
,
阅读 270
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=0,tt=-1;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] num = br.readLine().split(" ");
// a数组中由n个元素
int n = Integer.parseInt(num[0]);
// 滑动窗口的大小
int k = Integer.parseInt(num[1]);
String[] nums = br.readLine().split(" ");
// 初始化a数组
for(int i = 0; i < n; i++) a[i] = Integer.parseInt(nums[i]);
// 查找最小值
for(int i = 0; i < n; i++){
// 判断当前窗口是否大于滑动窗口的大小
if(hh <= tt && i-q[hh]+1 > k) hh++;
// 判断如果有元素并且队尾元素大于入队元素,则舍弃队尾元素来保证单调上升的队列;
while(hh <= tt && a[q[tt]] >= a[i]) tt--;
//向队列加入元素下标
q[++tt] = i;
// 如果下标大于等于窗口大小,那么输出队头元素
if(i+1 >=k) bw.write(a[q[hh]]+" ");
}
bw.write("\n");
hh = 0;
tt = -1;
// 查找最大值
for(int i = 0; i < n; i++){
// 判断当前窗口是否大于滑动窗口的大小
if(hh <= tt && i-q[hh]+1 > k) hh++;
// 判断如果有元素并且队尾元素小于入队元素,则舍弃队尾元素来保证单调上升的队列;
while(hh <= tt && a[q[tt]] <= a[i]) tt--;
//向队列加入元素下标
q[++tt] = i;
// 如果下标大于等于窗口大小,那么输出队头元素
if(i+1 >=k) bw.write(a[q[hh]]+" ");
}
bw.flush();
br.close();
bw.close();
}
}