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

LeetCode 热题 100——子串——滑动窗口最大值

11. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:

输入:nums = [1], k = 1
输出:[1]

提示:

1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length

求解

(1)暴力

思路:遍历 + 排序 + push最后一个元素。

var maxSlidingWindow = function(nums, k) {// 判断一些临界值if (nums.length < k) return []let ans = []// 遍历所有滑动窗口for (let i = 0; i < nums.length - k + 1; i++) {let item = nums.slice(i, i + k)item.sort((a, b) => a - b)ans.push(item[k - 1])}return ans
};

复杂度为 O(Nklog(k)):主要有排序
(2)优化
不用排序,复杂度变为:O(Nk)

var maxSlidingWindow = function(nums, k) {// 判断一些临界值if (nums.length < k) return []let ans = []// 遍历所有滑动窗口for (let i = 0; i < nums.length - k + 1; i++) {let max = -Infinityfor (let j = i; j < i + k; j++) {max = Math.max(nums[j], max)}ans.push(max)}return ans
};

但是上面两种方法都超出时间限制。

(3)单调队列

单调队列的核心是维护队列内元素的单调性(这里保持递减),队列头部始终是当前滑动窗口的最大值。

  • 入队操作:新元素入队时,从队列尾部开始,移除所有比当前元素小的元素(因为这些元素在当前元素之后,不可能成为后续窗口的最大值),然后将当前元素入队。
  • 出队操作:如果队列头部的元素是窗口左边界外的元素(即超出窗口范围),则将其从队列头部移除。
  • 获取最大值:队列头部的元素即为当前滑动窗口的最大值。
var maxSlidingWindow = function(nums, k) {// 判断一些临界值if (nums.length < k) return []let ans = []let deque = [] // 队列,递减,deque[0]为最大值for (let i = 0; i < nums.length; i++) {// 判断 左边界有没有超出while(deque.length > 0 && deque[0] < i - k + 1) {deque.shift()}// 删除队列中 比 当前要插入的值 小的while (deque.length > 0 && nums[deque[deque.length - 1]] < nums[i]) {deque.pop()}// 插入当前值deque.push(i)// 判断窗口是否成形if (i >= k - 1) {ans.push(nums[deque[0]])}}return ans
};

方法真的多种多样啊(((φ(◎ロ◎;)φ))),今天先这样吧。

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

相关文章:

  • CPP(容器)STL:
  • 【Java常用API】----- Math
  • RAG 系统 “检索 - 筛选 - 生成” 完整流程
  • 时间复杂度 和 嵌入式时钟概念 有关系。 我的理由是:时钟经常需要计算频率,而频率往往需要和时间进行计数次数i 。 时间复杂度就像是计数次数i
  • 公司做普通网站建立网站地图
  • Java 大视界 -- Java 大数据在智能农业病虫害精准识别与绿色防控中的创新应用
  • 【高并发架构】从 0 到亿,从单机部署到 K8s 编排:高并发架构的 8 级演进之路
  • 基于Streamlit的交互式3D手指运动学仿真
  • 甘肃做网站找谁金种子酒业网站建设
  • 使用 Flink CDC Elasticsearch Pipeline Connector 打通 MySQL 与 Elasticsearch 的实时链路
  • 基于视频识别的大模型项目实战心得
  • Firefly-Modeler 体积雕刻:AI 概念到 3D 基模
  • 提示词工程 - (2) 指南
  • 网络安全 | 深入理解SQL注入的原理和防范
  • python之循环导入
  • 强杀服务、重启系统及断电对 TDengine 影响
  • Odoo 19 制造与会计集成深度解析报告
  • 免费网站软件正能量医院网站建设方案计划书
  • 软件架构趋势:云原生与大模型的融合与重塑
  • 做网站会员登陆长春网站运做思路
  • 排序java
  • Substance 3D Stager:电商“虚拟摄影”工作流
  • 实验题辅导
  • 【Python TensorFlow】BiTCN-BiLSTM双向时间序列卷积双向长短期记忆神经网络时序预测算法(附代码)
  • 番禺制作网站平台邢台123信息网
  • 网页制作软件有那些石家庄seo网站排名
  • 高级边界扫描 --6-- Silicon Nail测试调试
  • Linux 序列化技术、自定义协议实现及守护进程
  • 【Javaweb学习|黑马笔记|Day5】Web后端基础|java操作数据库
  • ArcGIS地统计综合实战 | 洛杉矶臭氧浓度预测-pretict-pretictable-pretiction