算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好,我是怒码少年小码。

从本篇开始,我们就要开始算法的新篇章了——四大思想:滑动窗口、贪心、回溯、动态规划。现在,向我们迎面走来的是——滑动窗口思想!😝

滑动窗口思想

概念

在数组双指针里,我们介绍过"对撞型"和"快慢型"两种方式,而滑动窗口思想就是快慢型的特例。

实际使用

计算机网络中有滑动窗口协议(Sliding Window Protocol),该协议是TCP实现流量控制等的核心策略之一。事实上与流量控制、熔断、限流、超时等场景下都会首先从滑动窗口的角度思考问题,例如hystrix、sentinel等框架等都使用了这种思想。

理解

这个思想其实很好理解,如下图,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。

这个过程有点像火车在铁轨上跑,原始数据可能保存在一个很大的空间里(铁轨),但是我们标记的小区间就像一列长度固定的火车,一直向前走。

有了区间,就可以造题了,例如让你找序列上三个连续数字的最大和是多少、子数组平均数是多少(LeetCode643)等等。

窗口和滑动的含义:

  1. 窗口:窗口其实就是两个变量leftright之间的元素,也可以理解为一个区间。窗口大小不一定固定,思考两种场景:
  • 如果是固定的,一般要先确定窗口是否越界,再执行逻辑处理。则一般会让你求哪个窗口的元素最大、最小、平均值、和最大、和最小等类型的问题

  • 如果是可变的窗口,一般先判断是否满足要求,再执行逻辑处理。则一般要求一个序列里最大、最小窗口是什么

  1. 滑动:说明这个窗口是移动的,事实上移动的仍然是leftright两个变量,而不是序列中的元素。当变量移动时,其中间的元素必然会发生变化,因此就有这种不断滑动的效果.

注意事项

  1. 解题最终要落实到数组上,特别需要注意边界处理
  2. 有些元素的比较、判断等比较麻烦,要借助集合等工具,而且处理过程中还有一些技巧(常见方法的使用等)
  3. 堆,堆结构非常适合在流数据中找固定区间内的最大、最小等问题。因此滑动窗口经常和堆一起使用可以完美解决很多复杂问题.

那双指针和滑动窗口啥区别呢?

答:根据性质看到,滑动窗口是双指针的一种类型,主要关注两个指针之间元素的情况,范围更小一些,而双指针的应用范围更大,花样也更多。

入门小题

LeetCode 643:给你一个由 n 个元素组成的整数数组 nums 和一个整数 k。请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

先自己思考一下,不难但是想要完全做对还是要细心。例如我一开始就是先定义一个变量max保存最大值,然后left和right保存窗口两端。只要right不到数组边界,滑动窗口每次一变我就计算窗口内的元素之和,然后和max比较看看是否保存。

但是我一开始把max定为0,忽略数组内k个最大连续组序列的和是负数的情况。力扣上我又换回C++用INT_MIN来定义结果是直接超时了啊哈哈哈😁。正确代码如下:

public double findMaxAverage(int[] nums, int k) {if(k > nums.length || nums.length < 1 || k < 0){return 0;}int len = nums.length;int windowSum = 0;//先求出第一个窗口内的元素和for(int i = 0 ; i < k ;i++){windowSum = windowSum + nums[i];}//然后依次遍历,知道right达到数组边界,每次窗口变化选择变化前后最大的保存int maxSum = windowSum;for(int right = k ; right < len ; right++){windowSum = windowSum + nums[right] - nums[right - k];maxSum=Math.max(maxSum,windowSum);}return (double) maxSum / k;
}

最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

示例 1:

  • 输入:nums = [1,3,5,4,7]
  • 输出:3
  • 解释:最长连续递增序列是 [1,3,5], 长度为3。
    尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

示例 2:

  • 输入:nums = [2,2,2,2,2]
  • 输出:1
  • 解释:最长连续递增序列是 [2], 长度为1。

思路:如果当前遍历到的元素比它左边的那一个元素要严格大,right就增加;
否则就将left跳到right的起始位置,重新开始计算。

public int findLengthOfLCIS(int[] nums) {int left=0,right=0;int res=0;while(right < nums.length){//右侧的新元素比左侧小,则重新开始记录left的位置if(right > 0 && nums[right - 1] >= nums[right]){left = right;}right++;res=Math.max(res,right - left);}return res;
}

本题还有多种解法,另外一种思路是一边遍历,一边统计每个递增区间的长度,如果长度超过之前所有区间的长度,就将其保留,代码如下:

public int findLengthOfLCIS(int[] nums) {int curLen = 1;//当前递增区间的长度int res = 1;for(int i = 1;i < nums.length;i++){if(nums[i - 1] >= nums[i]){//不满足要求,重新进行数字计算curLen = 1;}else{curLen++;}res = Math.max(curLen,res);}return res;
}

可见就算不知道滑动窗口我们也能解决,所以滑动窗口就是个名字,不要被这些概念吓到。

END

本篇只是一个入门,很多时候往往存在即合理,这种思想一定在某个地方发挥着作用,我们下篇探讨!😎再见~

关注微信公众号:怒码少年。回复关键词【电子书】,领取多本计算机相关电子书
公众号后台开启了咨询业务,欢迎大家向我提问,免费,为爱发电😎

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

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

相关文章

虚拟化服务器+华为防火墙+kiwi_syslog访问留痕

一、适用场景 1、大中型企业需要对接入用户的访问进行记录时&#xff0c;以前用3CDaemon时&#xff0c;只能用于小型网络当中&#xff0c;记录的数据量太大时&#xff0c;本例采用破解版的kiwi_syslog。 2、当网监、公安查到有非法访问时&#xff0c;可提供基于五元组的外网访…

SPI协议详解

SPI协议详解 文章目录 SPI协议详解前言一、SPI是什么&#xff1f;二、通信原理SPI 通信的 4 种工作模式 总结 前言 好久没写这种协议了&#xff0c;最近正好需要用到&#xff0c;便详细的复习一下。 一、SPI是什么&#xff1f; SPI是串行外设接口&#xff08;Serial Periphe…

Android studio2022.3项目中,如何去除底部导航菜单项被点击时的点击反馈效果(涟漪效果)

如果使用bottomNavigationView.setItemBackgroundResource(0)来去除底部导航菜单点击反馈效果不生效&#xff0c;可能是由于其它样式或主题的影响。 在这种情况下&#xff0c;可以通过自定义选择器&#xff08;selector&#xff09;来设置底部导航菜单项的背景。 首先&#x…

Spring-动态代理

动态代理 代理模式&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 动态代理可以在不修改类源码的前提下&#xff0c;给类中方法增加额外逻辑 通过cglib来实现的代理对象的创建&#xff1a; 基于…

MES系统如何赋能制造企业实现4M防错追溯?

生产过程4M管理和MES系统的结合是现代制造业中关键的质量管理实践&#xff0c;它有助于提高生产效率、降低生产成本并保证产品质量。本文将深入探讨4M管理的概念&#xff0c;以及MES系统如何赋能制造企业实现4M防错追溯。 一、4M管理的概念 4M管理是指在制造过程中管理和控制四…

浅谈数据结构之递归

1. 递归的定义 递归是一种在解决问题时使用自身的特殊方法。在计算机科学和数据结构中&#xff0c;递归是一种通过将问题分解成更小的、相似的子问题来解决复杂问题的方法。递归可以直接或间接地调用自身&#xff0c;将大问题转化为规模较小的子问题&#xff0c;直到达到基本情…

leetCode 92.反转链表 II + 图解

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 206. 反转链表 - 力扣&#xff08;LeetCode&am…

区块链链游合约系统开发项目模式技术方案

​随着区块链技术的发展&#xff0c;链游合约系统开发逐渐成为了一个备受关注的项目。本文将探讨区块链链游合约系统开发项目的技术方案&#xff0c;包括项目背景、开发目标、技术架构、系统流程、安全措施等方面的内容。 一、项目背景 链游是一种基于区块链技术的游戏&#xf…

加密磁盘密钥设置方案浅析 — LUKS1

虚拟化加密磁盘密钥设置方案浅析 前言元数据分析元数据格式整体格式头部格式加密算法密码校验key slot格式其它字段 流程验证 前言 我们在虚拟化加密磁盘密钥设置方案浅析 — TKS1中介绍了加密磁盘密钥设置方案&#xff0c;TKS1对密钥设置(Linux Unified Key Setup)的流程和方…

阿里云容器镜像服务的运维总结

一、背景 容器镜像服务&#xff0c;作为一个可选付费产品&#xff0c;主要作用是存储docker的镜像仓库&#xff0c;供k8s拉取到Pod节点里。 你可以自己搭建一个harbor镜像仓库&#xff0c;在公司的开发环境下&#xff0c;将image推送到仓库&#xff1b;然后在生产k8s从仓库拉取…

7-5 计算每个学生的平均成绩

7-5 计算每个学生的平均成绩 分数 15 作者 殷伟凤 单位 浙江传媒学院 输入所有学生的姓名和成绩&#xff0c;以#结束。输出每个学生的平均成绩表。 输入格式: 每一行输入一个学生的姓名和成绩&#xff0c;以空格分隔。 输入完成后以#结束 输出格式: 每行显示一个学生的姓名和…

QtC++与QTreeView详解

介绍 QTreeView 是 Qt 框架中的一个视图控件&#xff0c;用于显示树形结构的数据。它是 QAbstractItemView 类的子类&#xff0c;通常与数据模型结合使用。以下是 QTreeView 的详细讲解和在 Qt 中的作用&#xff1a; QTreeView 的作用&#xff1a; 显示层次数据&#xff1a; …

ECharts:显示暂无数据

ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求&#xff0c;实现各种炫酷的统计图表效果。 如上图所示&#xff0c;有数据的时候固然好看&#xff0c;但是当它没有数据的时候&#xff0c;就是光秃秃的一片&#xff0c;所…

说说React Router有几种模式?实现原理?

一、是什么 在单页应用中,一个web项目只有一个html页面,一旦页面加载完成之后,就不用因为用户的操作而进行页面的重新加载或者跳转,其特性如下: 改变 url 且不让浏览器像服务器发送请求在不刷新页面的前提下动态改变浏览器地址栏中的URL地址其中主要分成了两种模式: has…

【GitHub】PR的学习笔记

PR流程 Fork the repository.Clone the fork-repo.Make the desired changes.Stage files: git add.Commit the changes: git commitPush them to the fork-online: git push.Create a pull request.

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

[文件读取]shopxo 文件读取(CNVD-2021-15822)

1.1漏洞描述 漏洞编号CNVD-2021-15822漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: ShopXO是一套开源的企业级开源电子商务系统。 ShopXO存在任意文件读取漏洞&#xff0c;攻击者可利用该漏洞获取敏感信息。 1.2漏洞等级 高危 1.3影响版本 ShopXO 1.4漏洞复现…

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例&#xff0c;我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单&#xff0c;一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

神经风格转化

深入到神经风格转换的领域。你就会发现尽管NST在概念上很容易理解&#xff0c;但要生成高质量图像却出奇地困难。为了获得良好的结果&#xff0c;必须正确实施许多复杂的细节和未提及的技巧。在本文中&#xff0c;我们将深入研究神经风格转换的知识&#xff0c;并详细研究这些技…