【问题】
给定数组arr和整数 num,返回共有多少个子数组满足如下情况:
max(arr[i...j])−min(arr[i...j])<=num
【解答】
package com.chanmufeng.codingInterviewGuide.stackAndQueue_10;
import java.util.LinkedList;
/**
*
*/
public class SubArrNum {
public static int getNum(int[] arr, int num) {
if (arr == null || arr.length == 0)
return 0;
int L = 0;
int R = 0;
int res = 0;
LinkedList<Integer> qmax = new LinkedList<>();
LinkedList<Integer> qmin = new LinkedList<>();
while (L < arr.length) {
while (R < arr.length) {
while (!qmax.isEmpty() && arr[R] >= arr[qmax.peekLast()]) {
qmax.pollLast();
}
qmax.addLast(R);
while (!qmin.isEmpty() && arr[R] <= arr[qmin.peekLast()]) {
qmin.pollLast();
}
qmin.addLast(R);
if (arr[qmax.peekFirst()] - arr[qmin.peekFirst()] > num) {
break;
}
R++;
}
res += (R - L);
if (qmax.peekFirst() == L) {
qmax.pollFirst();
}
if (qmin.peekFirst() == L) {
qmin.pollFirst();
}
L++;
}
return res;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3};
System.out.println(getNum(arr, 1));
}
}