最大值减去最小值小于或等于num的子数组数量
链接
给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况:
max(arr[i...j]) - min(arr[i...j]) <= num
max(arr[i...j])表示子数组arr[i...j]中的最大值,min[arr[i...j])表示子数组arr[i...j]中的最小值。
import java.util.*;
public class Main {
private static int solve(int[] arr, int k) {
int n = arr.length;
int ret = 0;
LinkedList<Integer> minQueue = new LinkedList<>();
LinkedList<Integer> maxQueue = new LinkedList<>();
int l = 0;
for (int i = 0; i < n; ++i) {
while (!minQueue.isEmpty() && arr[i] <= arr[minQueue.peekLast()]) {
minQueue.pollLast();
}
minQueue.offerLast(i);
while (!maxQueue.isEmpty() && arr[i] >= arr[maxQueue.peekLast()]) {
maxQueue.pollLast();
}
maxQueue.offerLast(i);
/**
* 移动左指针到满足条件的位置
*/
while (arr[maxQueue.peekFirst()] - arr[minQueue.peekFirst()] > k) {
if (maxQueue.peekFirst() > minQueue.peekFirst()) {
l = minQueue.pollFirst() + 1;
} else if (maxQueue.peekFirst() < minQueue.peekFirst()) {
l = maxQueue.pollFirst() + 1;
}
}
ret += (i - l) + 1;
}
return ret;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
int k = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; ++i) {
arr[i] = in.nextInt();
}
System.out.println(solve(arr, k));
}
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号