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

来源:互联网 发布:python 毫秒数 编辑:程序博客网 时间:2024/06/05 20:06

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


阅读全文
0 0
原创粉丝点击