子串

滑动窗口最大值

困难#239Java时间 O(n)空间 O(k),不含输出

题目要做什么

长度为 k 的窗口每次右移一格,返回每个窗口内的最大值。

题目示例输入nums = [1,3,-1,-3,5,3,6,7], k = 3
题目示例输出[3,3,5,5,6,7]

01 为什么这样做

双端队列保存候选下标,值从队首到队尾递减。过期下标从队首移除,较小的旧值从队尾淘汰;队首始终是当前最大值。

始终成立的条件

队列下标递增、对应数值递减,且所有下标都位于窗口内。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int[] maxSlidingWindow(int[] nums, int k) {3        Deque<Integer> deque = new ArrayDeque<>();4        int[] ans = new int[nums.length - k + 1];5        for (int i = 0; i < nums.length; i++) {6            while (!deque.isEmpty() && deque.peekFirst() <= i - k) deque.removeFirst();7            while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) deque.removeLast();8            deque.addLast(i);9            if (i >= k - 1) ans[i - k + 1] = nums[deque.peekFirst()];10        }11        return ans;12    }13}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索