标签:subarray height res lin 滑动 com empty col sub
1.找到最大值减去最小值小于等于一个数值的子数组数量
如果L~R范围上达标,那么里面的任何一个子数组都达标
如果L~R范围上不达标,当R向右扩时,必定不达标。
所有我们只需要遍历一次,每次找到以L开头的子数组达标的子数组数量。
使用滑动窗口,这里用到两个滑动窗口。特别简单,就是保持队列里面的大小顺序,当加入的数值破坏了规矩,那么就把队列的队头给弹出。
public class AllLessNumSubArray { public static int getNum(int[] arr ,int num){ if (arr == null || arr.length == 0) { return 0; } LinkedList<Integer> qmin = new LinkedList<Integer>(); LinkedList<Integer> qmax = new LinkedList<Integer>(); int L = 0; int R = 0; int res = 0; while(L < arr.length){ //L确定了之后,R往右扩. while(R < arr.length){ while(!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[R]){ qmin.pollLast(); } qmin.addLast(R); while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]){ qmin.pollLast(); } qmax.addLast(R); //如果达标了,就可以得出R-L个子数组 if(arr[qmax.getFirst()] - arr[qmin.getFirst()] > num){ break; } R++; } if (qmin.peekFirst() == L) { qmin.pollFirst(); } if (qmax.peekFirst() == L) { qmax.pollFirst(); } res += R -1; //如果R了不能扩了,就扩L L++; } return res; } }
标签:subarray height res lin 滑动 com empty col sub
原文地址:https://www.cnblogs.com/carryup/p/13768081.html