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;
}
posted @ 2017-10-12 20:34  江南何采莲  阅读(284)  评论(0编辑  收藏  举报