题解 | #最大值减去最小值小于或等于num的子数组数量#

import java.util.;
import java.io.
;
public class Main{
public static int getNum(int []arr,int num){
if(arr==null||arr.length==0||num<0){
return 0;
}
LinkedList<integer> qmin= new LinkedList<integer>();
LinkedList<integer> qmax= new LinkedList<integer>();
int i=0;
int j=0;
int res=0;</integer></integer></integer></integer>

    while(i<arr.length){
        while(j<arr.length){

            //到j不满足条件,所以[i+1..j]不一定满足条件
            //保证qmin尾部为j位置
            if(qmin.isEmpty()||qmin.peekLast()!=j){
                //qmin尾部对应元素比arr[j]大,更换qmin
                //必须保证qmin队尾最小
                while(!qmin.isEmpty()&&arr[qmin.peekLast()]>=arr[j]){
                    qmin.pollLast();
                }
                qmin.addLast(j);
                //必须保证qmax的队尾最大
                while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[j]){
                    qmax.pollLast();
                }
                qmax.addLast(j);
            }
            //qmax的最小值 - qmin的最大值
            if(arr[qmax.getFirst()]-arr[qmin.getFirst()]>num){
                break;
            }
            j++;
        }
        res+=j-i;
        //开头i要自增,应该把队列中的i移除,只可能在最大和最小地方出现,要不就提前被弹出了
        if(qmin.peekFirst()==i){
            qmin.pollFirst();
        }
        if(qmax.peekFirst()==i){
            qmax.pollFirst();
        }
        i++;
    }

    return res;
//getNum结束    
}

public static void main(String[] args)throws IOException {
    BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
    int n,num;
    String[] line1 = in.readLine().split(" ");
    n=Integer.parseInt(line1[0]);
    num=Integer.parseInt(line1[1]);
    String[] arr = in.readLine().split(" ");
    int []data=new int[n];
    for(int i=0;i<n;i++){
        data[i]=Integer.parseInt(arr[i]);
    }

    int result =getNum(data,num);
    System.out.println(result);

}

}

全部评论

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务