滑动窗口中的最大值


代码如下:

测试:

`public class MaxInWindows {

    public static void main(String[] args) {
        int[] i={2,3,4,2,6,2,5,1};
        int a=3;
        ArrayList<Integer> list = Solution1.maxInWindows(i, a);
        System.out.println(list);
    }
}

题解:

 class Solution {
    public static ArrayList<Integer> maxInWindows(int [] num, int size) {
        if(num==null||size==0||num.length<size) return null;

        MonotonicQueue window = new MonotonicQueue();
        ArrayList<Integer> res = new ArrayList<>();

        for (int i = 0; i < num.length; i++) {
            if (i < size - 1) {
                //先填满窗口的前 size - 1
                window.push(num[i]);
            } else {
                // 窗口向前滑动,加入新数字
                window.push(num[i]);
                // 记录当前窗口的最大值
                res.add(window.max());
                // 移出旧数字
                window.pop(num[i - size + 1]);
            }
        }

        return res;
    }
}

/* 单调队列的实现 */

class MonotonicQueue {
    LinkedList<Integer> q = new LinkedList<>();
    public void push(int n) {
        // 将小于 n 的元素全部删除
        while (!q.isEmpty() && q.getLast() < n) {
            //删除列表的最后一个元素,如果列表为空,返回null
            Integer integer = q.pollLast();
            System.out.println(integer);
        }
        // 然后将 n 加入尾部
        q.addLast(n);

    }

    public int max() {
        return q.getFirst();
    }

    public void pop(int n) {
        if (n == q.getFirst()) {
            q.pollFirst();
        }
    }
}
posted @ 2021-04-05 00:49  pangwan  阅读(63)  评论(0)    收藏  举报