标签:while poll 表示 for 窗口 add bar out util
给定数组arr和整数num,求数组的子数组中有多少个的满足“最大值减去最小值<=num”。
时间复杂度:i,j只需遍历一趟,时间复杂度O(n)。
import java.util.LinkedList;
public class Main {
public static void main(String args[]) {
int[] arr = { 1, 3, 2, 4, 5 };
int num = 1;
int cnt = subArrayNum(arr, num);
System.out.println(cnt);
}
public static int subArrayNum(int[] arr, int num) {
int cnt = 0;
LinkedList<Integer> maxQue = new LinkedList<>();
LinkedList<Integer> minQue = new LinkedList<>();
int i = 0;
int j = 0;
while (i < arr.length) {
while (j < arr.length) {
while (!maxQue.isEmpty() && arr[maxQue.peekLast()] <= arr[j]) {
maxQue.pollLast();
}
maxQue.addLast(j);
while (!minQue.isEmpty() && arr[minQue.peekLast()] >= arr[j]) {
minQue.pollLast();
}
minQue.add(j);
if (arr[maxQue.peekFirst()] - arr[minQue.peekFirst()] > num) {
cnt += j - i;
if (maxQue.peekFirst() == i) {
maxQue.pollFirst();
}
if (minQue.peekFirst() == i) {
minQue.pollFirst();
}
break;// 如果break ,j不++,因为当前arr[i...j]不满足条件,不能保证arr[i+1...j]满足条件
}
++j;
if (j == arr.length) {// 说明此趟以及后面未遍历的趟的子数组全部满足条件。
for (; i < arr.length; ++i) {
cnt += j - i;
}
break;
}
}
++i;
}
return cnt;
}
}
[程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(双端队列)
标签:while poll 表示 for 窗口 add bar out util
原文地址:https://www.cnblogs.com/coding-gaga/p/10878292.html