Java集合之LinkedList
Deque
- 定义
C++:deque
Java:LinkedList
- 创建与其基本操作
创建:
LinkedList qmax=new LinkedList<Integer>();
基本操作:
void clear( )
int peekFirst();
int peekLast();
int pollFirst();
int pollLast();
int addFirst(Object o);
int addLast(Object o);
例题
计算数组中所有满足以下条件的区间个数
区间最大值-区间最小值>=x
设定区间左端点不变,右端点右移,那么区间最大值减最小值显然是单调递增的。
利用单调性
二分解法搭配RMQ可以做到O(nlogn)
双指针搭配单调队列可以做到O(n)
public long solve(int[] arr,int n,int x) {
if(arr==null||arr.length==0) return 0;
LinkedList<Integer> qmax=new LinkedList<Integer>();
LinkedList<Integer> qmin=new LinkedList<Integer>();
int l=0,r=0,tr,t2r = 0;
long res=0;
while(l<n) {
while(r<n) {
while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[r]) qmax.pollLast();
while(!qmin.isEmpty()&&arr[qmin.peekLast()]>=arr[r]) qmin.pollLast();
qmax.addLast(r);qmin.addLast(r);
if(arr[qmax.peekFirst()]-arr[qmin.peekFirst()]>x) break;
r++;
}
res+=r-l;
if(qmax.peekFirst()==l) qmax.pollFirst();
if(qmin.peekFirst()==l) qmin.pollFirst();
l++;
}
return res;
}