【数据结构与算法】力扣 239. 滑动窗口最大值

题干描述

给你一个整数数组 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       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7      51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  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

分析解答

滑动窗口?双指针!(原谅我做题少,思路真的很单一)

依次找到每一个窗口中的最大值,添加到结果数组中。

/*** @param {number[]} nums* @param {number} k* @return {number[]}*/
// 超时 时间复杂度为O(nk)
var maxSlidingWindow = function (nums, k) {let i = 0let j = i + klet maxArr = []for (; j <= nums.length; ++i, ++j) {let tempNums = nums.slice(i, j)let max = Math.max(...tempNums)maxArr.push(max)}return maxArr
};

然后就… 超时了…

思路拓展

此时的滑动窗口就很像是一个队列,所以可以直接把它当做一个队列来分析解答。

而因为我们需要找到每一个滑动窗口的最值,所以就需要使用单调队列(维护一个队列的单调性)。单调队列的应用场景就是滑动窗口问题。

重点一(条件一): 而这道题我们需要维护的就是最大值,是队尾元素,也是我们最终需要存放到结果队列中的元素。要保持始终队尾元素是最大值,因为维护其他元素没有意义(不是我们要求的)。

重点二(条件二): 当滑动窗口不再覆盖的元素(队尾元素),需要直接弹出。

image.png

/*** @param {number[]} nums* @param {number} k* @return {number[]}*/
// 时间复杂度为 O(n)
var maxSlidingWindow = function (nums, k) {let result = [];let deque = [];for (let i = 0; i < nums.length; i++) {// 从队尾移除不在滑动窗口范围内的元素while (deque.length > 0 && deque[0] <= i - k) {deque.shift();}// 从队尾移除小于当前元素的元素,保持队列递减while (deque.length > 0 && nums[deque[deque.length - 1]] < nums[i]) {deque.pop();}// 将当前元素加入队列deque.push(i);// 当滑动窗口完全覆盖数组时,将队首元素加入结果数组if (i >= k - 1) {result.push(nums[deque[0]]);}}return result;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661701.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 多态详解

文章目录 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.3.1 虚函数重写的两个例外 2.4 C11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 多态的原理3.1 虚函数表3.2多态的原理 4. 单继承和多继承关系的虚函数表4.1 单继…

OBSERVER(观察者)-- 对象行为模式

意图&#xff1a; 定义对象间地一种一对多地依赖关系&#xff0c;当一个对象地状态发生改变时&#xff0c;所有对于依赖于它的对象都得到通知并被自动更新。 别名&#xff1a; 依赖(Dependents), 发布-订阅(Publish-Subsribe) 动机&#xff1a; 将一个系统分割成一系列相互协…

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

C++--const成员及const取地址操作符重载

前言 今天我们来了解一下const成员的基本使用,以及const取地址重载的运用 来开始今天的学习 const成员 1.基本定义, 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的*this指针&#xff0c;表明在该成员函…

DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧

1.替换CCS安装路径下的Flash.out文件 找到各自CCS的安装路径&#xff1a; D:\ti\ccs1230\ccs\ccs_base\c2000\flashAlgorithms 复制进芯电子国产DSP官网提供的配置文件 下载链接&#xff1a;https://mp.csdn.net/mp_download/manage/download/UpDetailed 2.替换原有文件 3.…

Object类的公共方法面试问题及回答

1. 什么是 Object 类&#xff1f; 答&#xff1a; Object 类是 Java 中所有类的超类。每个类都使用 Object 作为树的根&#xff0c;所有对象&#xff08;包括数组&#xff09;都实现这个类的方法。 2. Object 类中有哪些重要的方法&#xff1f; 答&#xff1a; equals(Obje…

GPT3 终极指南(二)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第五章&#xff1a;GPT-3 作为企业创新的下一步 当一个新的创新或技术转变发生时&#xff0c;大公司通常是最后一个采纳的。它们的等级结构…

【学习vue 3.x】(五)VueRouter路由与Vuex状态管理

文章目录 章节介绍本章学习目标 路由的基本搭建与嵌套路由模式vue路由的搭建嵌套路由模式 动态路由模式与编程式路由模式动态路由模式编程式路由 命名路由与命名视图与路由元信息命名路由命名视图路由元信息 路由传递参数的多种方式及应用场景路由传参 详解route对象与router对…

【数学视野】Softmax 函数和 Gibbs 分布之间的数学桥梁

Softmax 函数和 Gibbs 分布之间的数学桥梁 文章目录 一、说明二、Softmax 函数的定义和组件三、从逻辑到多类的泛化3.1 连接到 Gibbs 分布3.2 统计力学背景3.3 切换到 Softmax 功能 四、优化和计算稳定性4.1 Softmax 的梯度4.2 链接到信息论 五、总结 一、说明 softmax 函数是各…

瘦身秘籍:如何使用 PyInstaller 打造超小型 Python 可执行文件

你是否曾经尝试过将你的 Python 程序打包成一个可执行文件&#xff0c;却发现生成的文件大得惊人&#xff1f;别担心&#xff0c;本文将教你如何使用 PyInstaller 尽可能减小生成的 onefile 大小&#xff0c;让你的程序轻盈如风&#xff01; 1. 使用虚拟环境 首先&#xff0c…

MyBatis(XML映射器操作)

文章目录 XML映射器操作&#xff08;XxxMapper.xml&#xff09;文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

【JS篇之】异常

前言&#xff1a;在代码编写过程中&#xff0c;最常遇到的就是程序异常。其实异常并非坏事&#xff0c;它可以让开发人员及时发现、定位到错误&#xff0c;提醒我们做正确的事情&#xff0c;甚至在某些时候&#xff0c;我们还会手动抛出异常。 1.异常的分类 在JS中&#xff0…