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

双端队列(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)

一句话记忆

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

相关推荐
午彦琳6 分钟前
2026.9.11
数据结构·python·算法
careathers1 小时前
【数据结构】链表
数据结构·链表
302wanger1 小时前
蛋炒饭周刊 · 第 1 期(2026-09-07至2026-09-11)
算法
shehuiyuelaiyuehao1 小时前
算法43,外观数列,模拟算法+双指针
java·算法
alphaTao1 小时前
LeetCode 每日一题 2026/9/7-2026/9/13
算法·leetcode
kanhaoning2 小时前
Agent 记忆出现重复和矛盾怎么优化:我实测了6种去重和更新策略,找到了低成本维护记忆质量的方法
算法
hans汉斯2 小时前
【计算机科学与应用】层级评论上下文依赖识别数据集构建与研究——以小红书旅游评论数据为例
人工智能·算法·yolo·目标检测·cnn·旅游
码行山野赴时序归途2 小时前
顺序表(Sequential List)详解:从数组到 C 语言实现
c语言·开发语言·数据结构·算法
蓝速科技2 小时前
口岸政务窗口双屏翻译机落地应用指南
运维·数据结构·数据库·人工智能·科技·政务