滑动时间窗口,找一段区间中的最大值

双端队列(Deque) 维护"可能成为窗口最大值"的候选下标,

队头始终是当前窗口最大值,

每次右移窗口时:

  1. 弹出队头 过期 的下标(< left)
  2. 从队尾剔除 ≤ 新元素的下标
  3. 把新元素下标入队尾
  4. 记录队头值即可

时间 O(n) ,空间 O(k)


代码(int[] 版,可直接跑)

java 复制代码
import java.util.*;

public class SlidingWindowMax {

    // 返回每个窗口的最大值列表
    public static List<Integer> maxSlidingWindow(int[] nums, int k) {
        List<Integer> ans = new ArrayList<>();
        Deque<Integer> deq = new ArrayDeque<>(); // 存下标,单调递增

        for (int i = 0; i < nums.length; i++) {
            // 1. 弹出队头过期下标
            while (!deq.isEmpty() && deq.peek() < i - k + 1) {
                deq.poll();
            }
            // 2. 从队尾剔除 ≤ 当前值的候选
            while (!deq.isEmpty() && nums[deq.peekLast()] <= nums[i]) {
                deq.pollLast();
            }
            // 3. 当前下标入队
            deq.offer(i);
            // 4. 窗口形成后记录答案
            if (i >= k - 1) {
                ans.add(nums[deq.peek()]);
            }
        }
        return ans;
    }

    /* ---------- 测试 ---------- */
    public static void main(String[] args) {
        int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};
        int k = 3;
        System.out.println(maxSlidingWindow(nums, k)); // [3, 3, 5, 5, 6, 7]
    }
}

复杂度

  • 时间 :每个元素最多入队/出队一次 → O(n)
  • 空间 :双端队列长度 ≤ k → O(k)

一句话记忆

"队头永远是当前窗口最大值,队尾单调递减踢小弟,过期下标及时扔 "------这就是滑动窗口最大值的 单调队列 套路。

相关推荐
地平线开发者2 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮2 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者2 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考3 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx6 小时前
CART决策树基本原理
算法·机器学习
Wect6 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱7 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway14 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风14 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect14 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript