您的位置:首页 > 其它

最大值减去最小值小于或等于num的子数组数量

2017-10-24 17:55 211 查看


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));

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  子数组
相关文章推荐