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

廊坊网站制作套餐饮水机企业网站模板

廊坊网站制作套餐,饮水机企业网站模板,外贸营销运营,广告设计需要学什么课程LeetCode 239:滑动窗口最大值问题定义与核心挑战 给定整数数组 nums 和窗口大小 k,需返回每个滑动窗口的最大值。例如: 输入:nums [1,3,-1,-3,5,3,6,7], k3输出:[3,3,5,5,6,7] 核心挑战: 暴力法缺陷&#…

LeetCode 239:滑动窗口最大值

在这里插入图片描述

问题定义与核心挑战

给定整数数组 nums 和窗口大小 k,需返回每个滑动窗口的最大值。例如:

  • 输入:nums = [1,3,-1,-3,5,3,6,7], k=3
  • 输出:[3,3,5,5,6,7]

核心挑战:

  • 暴力法缺陷:直接遍历每个窗口(共 n-k+1 个),每个窗口遍历 k 个元素,时间复杂度 O(nk),当 n=10^5 时会超时。
  • 高效数据结构:需快速维护窗口内的最大值,支持新增元素移除过期元素操作。

核心思路:单调队列(双端队列)

利用 单调递减队列 维护窗口内的元素索引,确保:

  1. 队列内元素对应的值单调递减:队首始终是当前窗口的最大值。
  2. 队列内仅保留当前窗口的有效元素:移除窗口左侧的过期索引。

算法步骤详解

步骤 1:初始化单调队列

使用双端队列(Deque)存储元素索引(而非值),便于判断元素是否在窗口内。

Deque<Integer> deque = new LinkedList<>();
步骤 2:遍历数组,维护单调队列

遍历每个元素 nums[i],执行以下操作:

2.1 移除队列尾部的较小元素

当新元素 nums[i] 大于队列尾部元素对应的值时,尾部元素不可能成为当前或未来窗口的最大值(因为新元素更大且更晚离开窗口),故移除尾部元素,直到队列为空或尾部元素更大。

while (!deque.isEmpty() && nums[i] >= nums[deque.getLast()]) {deque.removeLast();
}
deque.addLast(i); // 将当前元素索引加入队列
2.2 移除队列头部的过期元素

窗口的左边界为 i - k + 1(当遍历到 i 时,窗口覆盖 [i-k+1, i])。若队首元素的索引小于左边界,说明该元素已不在窗口内,需移除。

int left = i - k + 1;
while (!deque.isEmpty() && deque.getFirst() < left) {deque.removeFirst();
}
2.3 记录窗口最大值

当遍历到 i >= k-1(即窗口已形成)时,队首元素即为当前窗口的最大值(因队列单调递减)。

if (i >= k-1) {result[resultIndex++] = nums[deque.getFirst()];
}

完整代码(Java)

import java.util.Deque;
import java.util.LinkedList;class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums == null || k == 0) return new int[0];int n = nums.length;int[] result = new int[n - k + 1];int resultIndex = 0;Deque<Integer> deque = new LinkedList<>(); // 存储索引,对应值单调递减for (int i = 0; i < n; i++) {// 步骤1:移除队列尾部所有比当前元素小的索引(保持单调递减)while (!deque.isEmpty() && nums[i] >= nums[deque.getLast()]) {deque.removeLast();}deque.addLast(i); // 加入当前元素索引// 步骤2:移除队首的过期索引(不在当前窗口内)int left = i - k + 1;while (!deque.isEmpty() && deque.getFirst() < left) {deque.removeFirst();}// 步骤3:当窗口形成时,记录最大值(队首元素)if (i >= k - 1) {result[resultIndex++] = nums[deque.getFirst()];}}return result;}
}

关键逻辑解析

1. 单调队列的维护逻辑
  • 尾部移除:确保队列内元素单调递减,新元素只与队尾比较,保证复杂度 O(1)(每个元素入队、出队各一次)。
  • 头部移除:仅当队首元素是窗口左侧的过期元素时才移除,保证队列内始终是当前窗口的有效元素。
2. 为什么存储索引而非值?
  • 需判断元素是否在窗口内(通过索引比较),而值无法提供位置信息。
3. 窗口形成的时机
  • i >= k-1 时,窗口 [i-k+1, i] 首次形成(如 k=3i=2 时窗口是 [0,2]),之后每次遍历都需记录最大值。

示例验证(以示例 1 为例)

输入nums = [1,3,-1,-3,5,3,6,7], k=3

遍历索引 i元素 nums[i]队列操作前移除尾部较小元素加入队列移除过期元素窗口是否形成结果数组
01[]-[0]--
13[0]移除 0(1<3)[1]--
2-1[1]-[1,2]-是(i=2≥2)[3]
3-3[1,2]-[1,2,3]队首1≥0(3-3+1=0)是(i=3≥2)[3,3]
45[1,2,3]移除3(-3<5)→ 移除2(-1<5)→ 移除1(3<5)[4]队首4≥1(4-3+1=1)是(i=4≥2)[3,3,5]
53[4]-[4,5]队首4≥2(5-3+1=2)是(i=5≥2)[3,3,5,5]
66[4,5]移除5(3<6)→ 移除4(5<6)[6]队首6≥3(6-3+1=3)是(i=6≥2)[3,3,5,5,6]
77[6]移除6(6<7)[7]队首7≥4(7-3+1=4)是(i=7≥2)[3,3,5,5,6,7]

复杂度分析

  • 时间复杂度O(n)。每个元素入队、出队各一次,双端队列操作均为 O(1)
  • 空间复杂度O(k)。队列最多存储 k 个元素(窗口大小)。

该方法通过 单调队列 高效维护窗口内的最大值,将时间复杂度从 O(nk) 降至 O(n),是处理滑动窗口最值问题的经典方案。

http://www.dtcms.com/a/502047.html

相关文章:

  • 网站备案取消上海发布微博
  • 网站怎么做彩页制作营销网站模板免费下载
  • 广州网站建设乐云seowordpress 统计文章数量
  • 淄博网站建设同圈科技东莞网站推广费用
  • 网站建设模板平台如何注册网站卖东西
  • 有什么网站建设类岗位大连做网站公司哪家好
  • 兴宁网站建设好网站建设公司的网站
  • 参考文献 教学网站建设南充城市建设投诉网站
  • 用vs2010做的网站的源码自己做发卡网站长
  • 保定网站电话erp软件是干嘛的
  • 小型企业网站的设计与实现长春建设网站公司哪家好
  • 外贸联系网站企业网络维护
  • 编程网站scratch在线使用小程序免费网站
  • 个人跨境电商怎么做无锡做网站优化哪家好
  • 东莞设计网站公司如何把网站做跳转浏览器链接
  • 最受欢迎的网站开发语言市场有率企业工商信息查询单在哪打印
  • 正规网站开发公司如何创建一个论坛
  • 石城网站建设企业系统有哪些
  • 中国工商银行官方网站登录怎么用手机自己做网站
  • 素马网站建设费用差距国外 网页框架搭建的网站
  • 网站关键词中间用国家免费技能培训
  • 企业网站源码利于优化雅安市建设工程招投标网站
  • 东莞道滘网站建设如何做动漫网站
  • 国外最牛设计网站怎样查找网站开发者
  • 洛阳网站建设启辰网络wordpress子目录站点
  • 免费建个超市网站益阳网络公司
  • 在家里怎样做网站网站关键词怎么选择
  • 库存网站建设定制百度云盘网官网
  • 营销网站设计实验傻瓜网页制作工具
  • 阿米纳网站建设网站建设微信