单调栈和窗口问题

算法题《二》给定一个整形数组arr,和一个整数num某个arr中的子数组sub,如果想达标,必须满足:sub中最大值-sub中最小值<= num,求返回arr中达标数组的数量

代码如下

` public static int reiget(int []arr ,int num){
        int count = 0;//总共的数量
        if (arr == null|| arr.length<=0){
            return  0;
        }
        LinkedList<Integer> xmin = new LinkedList<>();
        LinkedList<Integer> xmax = new LinkedList<>();
        int L = 0,R=0;
        //假设窗口[L...R)->[0,0)表示没有一个数
        //[0,1)表示有一个 [0,0]
        while (L<arr.length){//L是开头位置,尝试每一个开头
            //如果此时窗口的开头是L,下面的while工作,R向右扩到违规为止

            //
            while (!xmin.isEmpty() && arr[xmin.peekLast()] >= arr[R]){
                xmin.pollLast();
            }
            xmin.addLast(R);
            //R->arr[R]
            while (!xmax.isEmpty() && arr[xmax.peekLast()]<= arr[R]){
                xmax.pollLast();
            }
            xmax.addLast(R);
            if (arr[xmax.getFirst()] - arr[xmin.getFirst()] > num){
                break;
            }
            R++;
        }
        //R是最后一个达标位置的再下一个,第一个违规的位置
        count += R - L;
        if (xmin.peekFirst()==L){
            xmin.pollFirst();
        }
        if (xmax.peekFirst()== L){
            xmax.pollFirst();
        }
            L ++;
        return  count;
    }`
## **如果有看不懂的地方或者不对的地方请留言!!!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值