题目描述
输入描述
输出描述
输出共 1 行,包含一个整数,表示答案。
输入输出样例
示例 1
输入
6 3
4 6 5 2 3 1
输出
4
运行限制
最大运行时间:2s
最大运行内存: 256M
源码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
public class MAX最值差 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] strings=br.readLine().split(" ");
int n=Integer.parseInt(strings[0]);
int k=Integer.parseInt(strings[1]);
strings=br.readLine().split(" ");
int[] a=new int[n];
for (int i = 0; i < strings.length; i++) {
a[i]=Integer.parseInt(strings[i]);
}
int[] l=new int[n];
int[] r=new int[n];
Deque<Integer> queue=new ArrayDeque<Integer>();
for (int i = 0; i < n; i++) { //最小值
while(!queue.isEmpty() && queue.peekFirst() < i-k) queue.pollFirst();
while(!queue.isEmpty() && a[queue.peekLast()]>a[i]) queue.pollLast();
queue.offerLast(i);
l[i]=queue.peekFirst();
}
// for (int i = 0; i < l.length; i++) {
// System.out.print(l[i]+" ");
// }
// System.out.println();
queue.clear();
for (int i = 0; i < n; i++) { //最大值
while(!queue.isEmpty() && queue.peekFirst() < i-k) queue.pollFirst();
while(!queue.isEmpty() && a[queue.peekLast()]<a[i]) queue.pollLast();
queue.offerLast(i);
r[i]=queue.peekFirst();
}
// for (int i = 0; i < r.length; i++) {
// System.out.print(r[i]+" ");
// }
int ans=0;
for (int i = 0; i < n; i++) { //最大值减最小值 队列存的是下标
ans=Math.max(a[r[i]]-a[l[i]], ans);
}
System.out.println(ans);
}
}
使用滑动窗口的思想,遍历两次枚举出每次的最大值和最小值