239. 滑动窗口最大值

发布时间 2023-04-17 21:36:54作者: Chenyi_li

设计单调栈

class Solution {

    class MyQueue{
        Deque<Integer> deque = new LinkedList<>();
        // 弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
        public void poll(int val){
            if(!deque.isEmpty()&&val==deque.peek()){
                deque.poll();
            }
        }

        // 添加元素时,如果要添加的元素大于入口处元素,就将入口处元素弹出
        // 保证队列 大-》小
        
        public void add(int val){
            while(!deque.isEmpty()&& val>deque.peek()){
                deque.removeLast();
            }
            deque.add(val);
        }

        // 得到队首元素,此时队首元素就是最大的
        public int peek(){
            return deque.peek();
        }
    }

    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length==1){
            return nums;
        }
        int len = nums.length-k+1;
        // 存放结果数组  num是填充时的指针
        int[] res = new int[len];
        int num = 0; 
        //自定义队列
        MyQueue myQueue = new MyQueue();
        //先将前K个元素放入队列
        for(int i = 0; i < k; i++){
            myQueue.add(nums[i]);
        }
        res[num++] = myQueue.peek(); //这是加的第一个元素

        for(int i = k;i < nums.length; i++){
            // 移除滑动窗口最前面元素
            myQueue.poll(nums[i-k]);
            //滑动窗口加入下一个元素
            myQueue.add(nums[i]);
            // 记录此时最大的元素
            res[num++] = myQueue.peek();
        }

        return res;
    }
}