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

来源:互联网 发布:nba直播数据统计 编辑:程序博客网 时间:2024/05/18 02:55

程序员代码面试指南(左程云)读书笔记(9)

第一章

最大值减去最小值小于或等于num的子数组数量
题目:
 如果数组长度问N,请实现时间复杂度为O(N)的解法

package cn.chen.mystack;



import java.util.LinkedList;


public class Stack_10 {
  public static void main(String[] args) {
 Stack_10 s=new Stack_10();
 int[] a={2,5,4,7,36,7,4,2,9};
 s.getNum(a, 5);
}
  public 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){
     //存放最小数的双端队列 ,如果队列中最小数大于arr[j](新加入的数),弹出当前队列中的最小数,将arr[j]放入
     while(!qmin.isEmpty()&&arr[qmin.peekLast()]>=arr[j]){
     qmin.pollLast();
     }
     qmin.addLast(j);
     //存放最大数的双端队列 ,如果队列中最大数小于arr[j](新加入的数),弹出当前队列中的最大数,将arr[j]放入
     while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[j]){
     qmax.pollLast();
     }
     qmax.addLast(j);
     
     if(arr[qmax.getFirst()]-arr[qmin.getFirst()]>num){
     break;
     }
     j++;
     }
     if(qmin.peekFirst()==i){
     qmin.pollFirst();
     }
     if(qmax.peekFirst()==i){
     qmax.pollFirst();
     }
     res+=j-i;
     i++;
      }
      System.out.println(res);
      return res;
  }
}
0 0
原创粉丝点击