当前位置: 首页 > news >正文

239. 滑动窗口最大值

滑动窗口对应的数据结构是双端队列。

难点在于,窗口移动时,最大值可能掉出窗口,需要重新找出窗口内的最大值,时间复杂度为O((n-k+1)k)

  • 大小为n的数组中存在n-k+1个大小为k的窗口
  • 每个窗口内在k个元素中找出最大值

最好是把第二个时间简化到O(1)

于是,联想到单调栈,每进来一个元素,都可以直接找出当前的最大值/最小值。

因此,需要做到以下几点:

  • 当队首元素等于已经被删除的元素nums[i-1],那么将队首元素删掉
  • 入队时要保证队列保持非严格递减,保证栈底元素(队首元素)为最大值。
  • i大于等于0时,表示窗口已经构建出来,需要将当前的最大值(队首元素)记录在数组中。
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 0 || k == 0) return new int[0];
        Deque<Integer> deque = new LinkedList<>();
        int[] ans = new int[nums.length - k + 1];
        for (int j = 0, i = 1 - k; j < nums.length; ++i, ++j) {
            if (i > 0 && deque.peekFirst() == nums[i - 1]) {
                deque.removeFirst();
            }
            while (!deque.isEmpty() && deque.peekLast() < nums[j]) {
                deque.removeLast();
            }
            deque.addLast(nums[j]);
            if (i >= 0) ans[i] = deque.peekFirst();
        }
        return ans;
    }
}

相关文章:

  • 浅谈AVL树插入的平衡调节
  • 蓝桥杯学习-11栈
  • 蓝桥杯嵌入式(总结自用)
  • 【大模型】Transformer、GPT1、GPT2、GPT3、BERT 的论文解析
  • 机器学习扫盲系列(1) - 序
  • 在 Ubuntu 服务器上使用宝塔面板搭建博客
  • 【AI News | 20250316】每日AI进展
  • [C++面试] 关于deque
  • 【Node.js入门笔记4---fs 目录操作】
  • 点点-一款超级强大AI生活搜索助手
  • 内网环境安装dlv,本地远程调试go
  • 2.12[A]distribute sys
  • 豆包与 Trae 编程 IDE:开启智能编程新时代
  • 8.C语言分支结构详解:掌握if语句与关系操作符
  • 算法专题(五):模拟
  • Maven核心包:maven-resolver-api
  • 海鲜水产行业wordpress外贸主题
  • linux grub文件丢失
  • C语言之共用体
  • 腾讯混元大模型简介
  • 网站建设要多少钱怎样/百度云盘资源搜索
  • 网站建设费用计算/微信营销的优势
  • 网站备案 接入商备案/seo百科
  • 宿州网站建设优化/域名检测查询
  • 网站收录查询接口/seo学徒是做什么
  • 专业网站建设哪家权威/外贸推广