题解 | #最大值减去最小值小于或等于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);

}

}

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
不敢追175女神:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务