import java.util.LinkedList;
//最大值减去最小值小于或等于num的子数组数量
public class getAllSubArray{
//获得子数组的数量
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 i=0;
int j=0;
int res=0;
while(i<arr.length)
{
while(j<arr.length)
{
while(!qmin.isEmpty()&&arr[qmin.peekLast()]>=arr[j])
{
qmin.pollLast();
}
qmin.addLast(j); //新的最小值加入qmin队列尾
while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[j])
{
qmax.pollLast();
}
qmax.addLast(j);//新的最大值加入qmax队列尾
if(arr[qmax.getFirst()]-arr[qmin.getFirst()]>num)
{
break;
}
j++;
}
if(qmin.peekLast()==i)
{
qmin.pollFirst();
}
if(qmax.peekFirst()==i)
{
qmax.pollFirst();
}
res+=j-i; //记录总的子数组的个数
i++;
}
return res;
}
//获得随机的数组
public static int [] getAarry(int leng)
{
if(leng==0)
{
return null;
}
int arr[]=new int[leng];
for(int i=0;i<leng;i++)
{
arr[i]=(int)(Math.random()*10);
}
return arr;
}
//打印获得的随机数组
public static void printAarry(int[]arr)
{
if(arr!=null)
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
}
}
public static void main(String[] args)
{
、
int []arr=getAarry(2);
printAarry(arr);
//获得满足条件的子数组的数量
System.out.println(" ");
System.out.println("子数组数量: "+getNum(arr,3));
}
}
最大值减去最小值小于或等于num的子数组数量
最新推荐文章于 2021-07-06 21:16:23 发布