Leetcode239. 滑动窗口最大值

本文介绍了如何利用单调队列解决LeetCode上的滑动窗口最大值问题。通过维护一个总是保持最大值在队头的队列,实现了在窗口每次滑动时高效地更新最大值。入队和出队操作确保了队列的单调性,从而简化了复杂度。最终,通过MyQueue类实现了一个辅助数据结构,用于求解滑动窗口的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

239. 滑动窗口最大值 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1L8https://leetcode-cn.com/problems/sliding-window-maximum/需要一个单调队列,这个队列的队头永远是最大的元素。窗口每往后移动一次,就将窗口中最左边的元素出队,最右边的下一个元素入队。

为了保持窗口中最大值永远在队头,需要定义这个队列的入队和出队规则:

入队:如果要入队的元素大于队尾元素,就把队尾元素移除,以保证越大的越靠近队头。例如队列本来是5,3,2,1现在4要入队,入队后队列就变成5,4。

出队:出队操作是为了让滑动窗口滑过的元素退出比较。如果要出队的元素就在队头,则移除它,否则说明它比队头小,之前就被移除过了,不需要进行任何操作。

此时滑动窗口最大值就是队头元素了。

class Solution {
    static class MyQueue{
        private Deque<Integer> deque = new LinkedList<>();
        public void poll(int val){
            if (!deque.isEmpty() && val==deque.peek()){
                deque.poll();
            }
        }

        public void push(int val){
            while (!deque.isEmpty() && val>deque.getLast()){
                deque.removeLast();
            }
            deque.add(val);
        }

        public int getMax(){
            return deque.peek();
        }
    }
    public static int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length - k + 1];
        MyQueue myQueue = new MyQueue();
        for (int i=0;i<k;i++){
            myQueue.push(nums[i]);
        }
        int n = 0;
        res[n++] = myQueue.getMax();

        for (int i=k;i<nums.length;i++){
            myQueue.poll(nums[i-k]);
            myQueue.push(nums[i]);
            res[n++] = myQueue.getMax();
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值