算法题-最大值减去最小值小于或等于 num 的子数组数量

【题目】 
给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况: 
max(arr[i..j]) - min(arr[i..j]) <= num 
max(arr[i..j])表示子数组 arr[i..j]中的最大值,min(arr[i..j])表示子数组 arr[i..j]中的最 小值。 
【要求】 
如果数组长度为 N,请实现时间复杂度为 O(N)的解法。
import java.util.LinkedList;

/**
 * Created by 糖糖 on 2017/8/2.
 */
public class getnum33 {
    public static  int getnum(int arr[],int num){
        LinkedList<Integer> qmin=new LinkedList<>();
        LinkedList<Integer> qmax=new LinkedList<>();
        int res=0;
        int i=0;
        int j=0;
        while (i<arr.length){
            while (j<arr.length){
                while (!qmin.isEmpty() && arr[qmin.peekLast()]>= arr[j])
                    qmin.pollLast();
                qmin.addLast(j);
                while (!qmax.isEmpty() && arr[qmax.peekLast()]<=arr[j])
                    qmax.pollLast();
                qmax.addLast(j);
                if(arr[qmax.peekFirst()]-arr[qmin.peekFirst()]>num)
                    break;
                j++;
            }

            if(i==qmin.peekFirst())
                qmin.pollFirst();
            if(i==qmax.peekFirst())
                qmax.pollFirst();
            res+=j-i;
            i++;

        }
        return  res;
    }
    public  static void main(String args[]){
        int arr[]={3,4,5,1,7,8};
        System.out.print(getnum(arr,2));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值