双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]

集合 关系 介绍

Deque 是一个接口

LinkedList 是这个接口的实现类

题目

输入输出

滑动窗口

基于双端队列实现

复制代码
Deque<Integer> deque = new LinkedList<>();

滑动窗口代码

复制代码
  public static List<Integer> maxSlidingWindow(int[] nums, int k) {
        List<Integer> result = new ArrayList<>();
        Deque<Integer> deque = new LinkedList<>();
        
        for (int i = 0; i < nums.length; i++) {
            // 移除不在当前窗口的元素
            if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
                deque.pollFirst();
            }

            // 移除队列中比当前元素小的元素,因为它们不可能成为最大值
            while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {
                deque.pollLast();
            }

            // 将当前元素的索引加入队列
            deque.offerLast(i);

            // 窗口已满,记录当前窗口的最大值
            if (i >= k - 1) {
                result.add(nums[deque.peekFirst()]);
            }
        }
        
        return result;
    }

    // 求每个窗口的最小值
    public static List<Integer> minSlidingWindow(int[] nums, int k) {
        List<Integer> result = new ArrayList<>();
        Deque<Integer> deque = new LinkedList<>();
        
        for (int i = 0; i < nums.length; i++) {
            // 移除不在当前窗口的元素
            if (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {
                deque.pollFirst();
            }

            // 移除队列中比当前元素大的元素,因为它们不可能成为最小值
            while (!deque.isEmpty() && nums[deque.peekLast()] >= nums[i]) {
                deque.pollLast();
            }

            // 将当前元素的索引加入队列
            deque.offerLast(i);

            // 窗口已满,记录当前窗口的最小值
            if (i >= k - 1) {
                result.add(nums[deque.peekFirst()]);
            }
        }
        
        return result;
    }
相关推荐
m0_7487080518 小时前
C++代码移植性设计
开发语言·c++·算法
Dr.Kun18 小时前
【鲲码园PsychoPy】Go/No-go范式
开发语言·后端·golang
Σίσυφος190018 小时前
特征值分解eig
人工智能·算法
子豪-中国机器人18 小时前
2026年1月31日特长测试常见难点
算法
郝学胜-神的一滴18 小时前
Linux Socket模型创建流程详解
linux·服务器·开发语言·网络·c++·程序人生
m0_7066532318 小时前
Python入门:从零到一的第一个程序
jvm·数据库·python
zhengfei61118 小时前
踪有趣的 Linux(和 UNIX)恶意软件。提交 PR
java·数据库·mysql
「QT(C++)开发工程师」18 小时前
C++ 观察者模式
java·c++·观察者模式
2301_7657031418 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
可问春风_ren18 小时前
Vue3 入门详解:从基础到实战
开发语言·前端·javascript·vue.js·前端框架·ecmascript·edge浏览器