有关数组的算法题

Posted carryup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关数组的算法题相关的知识,希望对你有一定的参考价值。

1.找到最大值减去最小值小于等于一个数值的子数组数量

如果L~R范围上达标,那么里面的任何一个子数组都达标

如果L~R范围上不达标,当R向右扩时,必定不达标。

所有我们只需要遍历一次,每次找到以L开头的子数组达标的子数组数量。

使用滑动窗口,这里用到两个滑动窗口。特别简单,就是保持队列里面的大小顺序,当加入的数值破坏了规矩,那么就把队列的队头给弹出。

 

技术图片

 

技术图片

 

public class AllLessNumSubArray {
    public static 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 L = 0;
        int R = 0;
        int res = 0;
        while(L < arr.length){
            //L确定了之后,R往右扩.
            while(R < arr.length){
                while(!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[R]){
                    qmin.pollLast();
                }
                qmin.addLast(R);
                while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[R]){
                    qmin.pollLast();
                }
                qmax.addLast(R);
                //如果达标了,就可以得出R-L个子数组
                if(arr[qmax.getFirst()] - arr[qmin.getFirst()] > num){
                    break;
                }
                R++;
            }
            if (qmin.peekFirst() == L) {
                qmin.pollFirst();
            }
            if (qmax.peekFirst() == L) {
                qmax.pollFirst();
            }
            res += R -1;
            //如果R了不能扩了,就扩L
            L++;
        }
        return res;
    }
}

 

以上是关于有关数组的算法题的主要内容,如果未能解决你的问题,请参考以下文章

操作系统有关计算题

算法竞赛入门码蹄集进阶塔335题(MT3330-3335)

算法笔记_116:算法集训之代码填空题集三(Java)

java算法面试题:有数组a[n],用java代码将数组元素顺序颠倒

15个使用频率极高的基础算法题(附完整代码)

与二叉树有关的编程题的Java代码实现