JavaScript刷LeetCode拿offer-滑动窗口

news2025/2/3 7:09:51

一、前言

《JavaScript刷LeetCode拿offer-双指针技巧》中,简单地介绍了双指针技巧相比较单指针的优点,以及结合 Easy 难度的题目带大家进一步了解双指针的应用。

进入 Medium 难度之后,解题的关键在于如何构造双指针以及确定指针移动的规则,解题方法可以归纳为以下两类:

  • 滑动窗口算法(Sliding Window Algorithm);

  • 对数组进行预处理(如:排序,前缀和等等),再利用双指针遍历;

这两种方法都可以将双循环问题转化为单循环问题,从而有效地降低算法的时间复杂度。本篇主要介绍滑动窗口算法以及相关题型的解题思路,第二类题型会放在下一篇中讲解。

滑动窗口算法具体的表现形式为:左右指针始终维护一个满足条件的窗口值,右指针负责向前遍历,当窗口值不满足条件时,将左指针指向的元素移出窗口,同时向前移动左指针。

下面,结合实际的题目来理解如何使用滑动窗口算法。

二、567. 字符串的排列

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。

本道题目实际上可以转化为是否能找出满足以下条件的 s2 字符串的子串:

  • 该子串的长度和 s1 字符串的长度相等;

  • 该子串中包含的字符以及对应的数量和 s1 字符串相同;

那么结合滑动窗口算法,需要维护一个长度为 s1 字符串长度的窗口,并且窗口中的字符以及相应的数量与 s1 相同。

字符数量通过 HashTable 来维护,在 JavaScript 语言中可以采用 Map 数据结构。

在这里插入图片描述

三、904. 水果成篮

在一排树中,第 i 棵树产生 tree[i] 型的水果。你可以从你选择的任何树开始,然后重复执行以下步骤:1、把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。2、移动到当前树右侧的下一棵树。如果右边没有树,就停下来。请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。用这个程序你能收集的水果总量是多少?

这道题很明显符合滑动窗口算法的特征:维护一个至多有两种水果的窗口。

当窗口中出现第三种水果时,需要从窗口的左边依次移除果树,保证当前窗口只含有两种水果,这里可以采用 HashTable 记录同一类型果树最后出现的坐标来优化时间复杂度。

最后,在窗口移动的过程中,计算相应的水果总量即可。

在这里插入图片描述

四、3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

参考视频:传送门

这道题目与上一道《904. 水果成篮》的解题思路如出一撤:

  • 维护一个不含重复字符的窗口

  • 当窗口不满足条件时,从窗口右侧依次移除字符,确保窗口再次满足条件,同样可以采用 HashTable 记录相同字符最后出现的下标来优化时间复杂度
    在这里插入图片描述

五、713. 乘积小于K的子数组

给定一个正整数数组 nums。找出该数组内乘积小于 k 的连续的子数组的个数。

本题需要维护一个乘积小于 k 的窗口,与上述题目相比,本题不需要太多技巧去计算有效的窗口值,它的难点在于满足乘积的数组的长度正好是当前不重复子数组的数量

在这里插入图片描述

六、845. 数组中的最长山脉

我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:1、B.length >= 3;2、存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)给出一个整数数组 A,返回最长 “山脉” 的长度。如果不含有 “山脉” 则返回
0。

以本题为例,感受一下朴素解法与滑动窗口算法之间的差距。

朴素解法的思路:依次以数组中的元素为“峰顶”,如果满足“山脉”的条件,那么统计长度。

在这里插入图片描述

上述代码的时间复杂度为 O(n^2)。

本题利用滑动窗口算法的难点在于如何确定当前窗口中的有效“山脉”形态:

  • 窗口移动的过程中,需要采用两个变量来记录当前窗口中包含的序列的单调性;

  • 窗口移动过程中遇到递增序列时,如果此时窗口中已经包含递减序列,那么需要向前移动左指针,重新构成“山脉”;

  • 窗口移动过程中遇到递减序列时,如果此时窗口中不包含递增序列,同样需要向前移动左指针,重新构成“山脉”;

在这里插入图片描述

利用滑动窗口算法成功地将时间复杂度降低为 O(n)。

写在最后

算法作为计算机的基础学科,用 JavaScript 刷,一点也不丢人ε=ε=ε=┏(゜ロ゜;)┛。

本系列文章会分别给出一种算法的3种难度的总结篇(简单难度,中等难度以及困难难度)。在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。

如果本文对您有所帮助,可以点赞或者关注来鼓励博主

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从 0 开始学 Python 自动化测试开发(二):环境搭建

本文是「从 0 开始学 Python 自动化测试开发」专题系列文章第二篇 —— 环境搭建篇&#xff0c;适合零基础入门的同学。没有阅读过上一篇的同学&#xff0c;请戳主页看上一篇噢。作者方程老师&#xff0c;是前某跨国通信公司高级测试经理&#xff0c;目前为某互联网名企资深测试…

常见管理网络的net命令

目录1 简介2 常用命令2.1 net view2.2 net user2.3 net use2.4 net start2.5 net stop2.6 net share1 简介 net 命令是一种基于网络的命令&#xff0c;该命令包含了管理网络环境、服务、用户、登录等大部分重要的管理功能。 2 常用命令 2.1 net view 作用&#xff1a;显示域…

Spring 之 @Component 和 @Configuration 两者区别以及源码分析

之前一直搞不清 Component 和 Configuration 这两个注解到底有啥区别&#xff0c;一直认为被这两修饰的类可以被 Spring 实例化嘛&#xff0c;不&#xff0c;还是见识太短&#xff0c;直到今天才发现这两玩意有这么大区别。很幸运能够及时发现&#xff0c;后面可以少走点坑&…

操作系统知识点

操作系统的目标&#xff1a; 方便&#xff1a;使计算机系统易用 有效&#xff1a;以更有效的方式使用计算机系统资源 扩展&#xff1a;方便用户有效开发、测试和引进新功能 操作系统的 作用&#xff1a; 1. 有效的管理资源 2.通过命令接口、编程接口等为用户提供各种…

【自然语言处理】【ChatGPT系列】Chain of Thought:从大模型中引导出推理能力

Chain-of-Thought Prompting&#xff1a;从大模型中引导出推理能力《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》论文地址&#xff1a;https://arxiv.org/pdf/2201.11903.pdf 相关博客 【自然语言处理】【ChatGPT系列】Chain of Thought&#xf…

什么是加权轮询?云解析DNS是否支持加权轮询?-中科三方

什么是加权轮询&#xff1f; 所谓的加权轮询算法&#xff0c;其实就是Weighted Round Robin&#xff0c;简称wrr。在我们配置Nginx的upstream的时候&#xff0c;带权重的轮询&#xff0c;其实就是wrr。 upstream backend { ip_hash; server 192.168.1.232 weight4; server 19…

无疫苗未吃药,48小时内阳康全纪实个案

为了不误导不同体质的人&#xff0c;特意强调这是个案&#xff0c;阳康方案仅供参考。小编体质偏寒&#xff0c;长期熬夜&#xff0c;黑白颠倒&#xff0c;有习惯性头痛症。经验总结&#xff1a;1.受到风寒是病发的直接导火索&#xff0c;就算携带病毒&#xff0c;本体没有受到…

Android实现红绿灯检测(含Android源码 可实时运行)

Android实现红绿灯检测(含Android源码 可实时运行) 目录 Android实现红绿灯检测(含Android源码 可实时运行) 1. 前言 2. 红绿灯检测数据集说明 3. 基于YOLOv5的红绿灯检测模型训练 4.红绿灯检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &…

吉林优美姿:抖音怎么增加销量?

为了更好的在做抖音好物联盟&#xff0c;那么一些抖音达人也会想方设法的去报名申请&#xff0c;那么大家是否真的清楚这个报名要怎么做呢&#xff1f;具体有什么要求呢&#xff1f;跟着吉林优美姿小编来一起看看吧&#xff01; 注册要求&#xff1a;凡注册抖音 APP并开通产品分…

大数据培训Impala之存储和压缩

注&#xff1a;impala不支持ORC格式 1.创建parquet格式的表并插入数据进行查询 [hadoop104:21000] > create table student2(id int, name string) > row format delimited > fields terminated by ‘\t’ > stored as PARQUET; [hadoop104:21000] > insert …

工控CTF之协议分析9——其他协议

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

【计算机视觉】回顾2022年计算机视觉领域最激动人心的进展

目录&#xff1a;回顾2022年计算机视觉一、前言二、计算机视觉趋势2.1 Transformer统治计算机视觉2.2 以数据为中心的计算机视觉获得牵引力2.3 AI 生成的艺术作品2.4 多模态人工智能成熟三、计算机视觉的新应用3.1 运动领域3.2 环境保护3.3 自动驾驶3.4 健康与医药四、总结一、…

数据类型隐式转换导致的阻塞

背景 不合适的数据类型隐式转换会导致性能下降和并发下降&#xff0c;而且大多数技术人员对隐式转换的概念是陌生的&#xff0c;因此在生产环境中非常常见&#xff0c;通过本文做一个系统的梳理。 现象 收到SQL专家云阻塞告警邮件&#xff0c;登录SQL专家云&#xff0c;进入实…

推荐系统学习笔记-冷启动

简介 推荐系统的主要目标是将大量的标的物推荐给可能喜欢的海量用户, 这里涉及到标的物和用户两类对象。任何互联网推荐产品, 标的物和用户都是不断增长变化的&#xff0c;所以一定会频繁面对新标的物和新用户, 推荐系统冷启动问题指的就是对于新注册的用户或者新入库的标的物…

CDGA|2022年内有超20家银行因数据治理模块受罚,原因都在这里

今年&#xff0c;银保监会对银行数据治理的监管趋严&#xff0c;对银行机构在监管数据质量和数据报送中存在的违法违规行为&#xff0c;不断加大处罚与整治力度。 近日&#xff0c;北京农商银行收到的一张630万元罚单显示&#xff0c;该行主要存在的违法违规事实具体为&#xf…

NVMe解读

看NVMe协议&#xff08;1.0e&#xff09;过程中&#xff0c;参考了SSDFans的很多文章内容&#xff0c; 目录 1. 综述 3 1.1 名词解释 3 1.1.1 Namespace 3 1.1.2 Fused Operations 4 1.1.3 指令执行顺序 4 1.1.4 写单元的原子性 4 1.1.5 元数据 4 1.1.6 仲裁机制 4 1…

图数据库知识点3:图数据库解决了什么问题?

在前面的两个知识点中我们先后介绍了&#xff1a; 知识点1&#xff1a;图数据库与关系型数据库的区别 知识点2&#xff1a;图思维方式 现在,我们可以更进一步来通过具体的例子来了解图数据库、图计算到底解决了什么问题。我们先来剖析下面这个问题&#xff1a; 图数据库查询…

【Vue实用功能】elementUI 自定义表单模板组件

elementUI 实现一个自定义的表单模板组件 注&#xff1a;该功能基于elementUI 背景&#xff1a;在项目开发中&#xff0c;我们会遇到这种需求&#xff0c;在管理后台添加自定义表单&#xff0c;在指定的页面使用定义好的表单 直接上代码&#xff1a; <template><di…

DBCO-PEG-NHS, 可溶于水,有多种分子量供选择

凯新生物DBCO-PEG-NHS衍生物可以点击化学反应不需要任何金属催化剂。反应促进1,3-偶极环加成反应&#xff0c;环辛炔和叠氮化合物&#xff0c;也被称为铜自由点击反应&#xff0c;是一种生物正交反应使溶液中的两个分子的共轭。DBCO PEG衍生物具有缓冲溶液中快速的动力学和稳定…

C语言基础【程序=算法+数据结构】——(数据结构——基础篇)

欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新。 文章目录✨前言✨数据的表现形式✨数据类型一、基本类型1.1、整型类型1.1.1、基本整型(int)1.1.2、短整型(short int)1.1.3、长整型(long int)1.1.4、*双长整型(long long int)1.1.5、字…