首页 > 其他 > 详细

滑动窗口中的最大值

时间:2021-04-05 12:32:15      阅读:20      评论:0      收藏:0      [点我收藏+]

代码如下:

测试:

`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();
        }
    }
}

滑动窗口中的最大值

原文:https://www.cnblogs.com/pangwan/p/14617654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!