基础算法(5):滑动窗口

1.何为滑动窗口?

     滑动窗口其实也是一种算法,主要有两类:一类是固定窗口,一类是可变窗口。固定的窗口只需要一个变量记录,而可变窗口需要两个变量。

2.固定窗口

     就像上面这个图一样。两个相邻的长度为4的红色窗口,下一个窗口一定比前一个窗口少一个数据,以及多一个数据。

      橙色为切换窗口时少的那个数据,黄色为多出来的那个数据,所以可以直接沿用之前数据,并且减去橙色数据,加上黄色数据,就是下一个窗口的值了。这就是滑动窗口的一个经典思路。

2.1 例题解析

      首先题是这样的

给你一个整数数组arr和两个整数k和target。请你返回长度为k且平均值大于等于target的子数组数目。

       我们可以看到他已经确定了窗口的长度,像这种滑动窗口的问题,一般都是连续字串和连续子数组的问题,在我做过的题中还没有例外,这也是滑动窗口的应用限制,必须连续。下面让我们看看怎么写:

       (1)首先,统计前k个数的和sum,作为第一个窗口的值,并且判断是否满足sum>=target,如果满足,则计数器加一;

       (2)然后,窗口开始右移,以后每次通过前一个相邻窗口,计算得到下一个窗口的值,并且判断条件是否满足满足则计数器加一;

       (3)返回计数器的值;

nclude<iostream>
int numOfSubarrays(int* arr, int arrSize, int k, int target)
{int r;int sum = 0;int cnt = 0;for (r = 0; r < k; r++){sum += arr[r];}if (sum >= target)cnt++;for (r = k; r < arrSize; r++){sum -= arr[r - k];sum += arr[r];if (sum >= target)cnt++;}return cnt;
}

2.2 leetcode固定窗口题目及模板总结

2.2.1 定长字串中元音的最大数目  
class Solution {
public:int check(char c)//每次遇到一个字符都需要进行判断,所以我们自己实现一个函数,避免重复代码{if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u'){return 1;}return 0;}int maxVowels(string s, int k) {int n=s.size();int r=0;//窗口边界int cnt=0;//计数器int sum=0;//比较迭代的变量for(;r<n;r++)//开始遍历{cnt+=check(s[r]);//向窗口内添加元素if(r>=k)//窗口长度大于给定值{cnt-=check(s[r-k]);滑动直到长度等于k,减去左边元素,向右不断滑动}sum=max(sum,cnt);//将sum和cnt的值进行比较,这里sum其实起到了比较作用,将cnt的值存储到sum中}return sum;}
};
2.2.2 长度最小的子数组

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int r;int result=INT32_MAX;int sum=0;int i=0;for(r=0;r<nums.size();r++){sum+=nums[r];while(sum>=target){result=min(result,r-i+1);sum-=nums[i++];}}return result==INT32_MAX?0:result;}
};

       从这两道题中我们看到了一些相似的代码,这就是

2.2.3 固定窗口长度模板
int subarrays(int* arr, int k, int target)
{ int n=arr.size();//数组长度int r;//窗口边界int cnt = 0;//一般用来求和或者计数,视题目而定int sum = 0;//比较迭代的变量for (; r < n; r++)//开始遍历{cnt += arr[r];//向窗口内添加元素if (r >= k)//窗口长度大于给定值{cnt -= arr[r - k]; //减去左边元素,向右不断滑动,直到长度等于k}sum = max(sum, cnt);//更新sum的值,将sum和cnt的值进行比较,这里sum其实起到了比较作用,将cnt的值存储到sum中}return sum;
}

3.非固定窗口

3.1 例题解析

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。

     这个题怎么写呢?这个可没有说求固定长度,你翻转最多k个0之后连续1的长度最大,这个长度就是数组中连续1的最大个数,那我们就把固定长度不固定就ok了啊,下面看代码解析:

int longestOnes(vector<int>& nums, int k) {int n=nums.size();//数组/字符串长度int sum=0;//用于统计子数组/子区间是否有效,看题目要求,可能是求和/计数int l=0;//双指针,代表遍历的区间int zerocnt=0;//统计0的个数for(int r=0;r<n;r++){if(nums[r]==0)zerocnt++;//满足题目要求,计数器+1while(zerocnt>k)//翻转0的个数大于k{if(nums[l++]==0)zerocnt--;//那就开始滑动窗口了,左边界开始滑动,这时候需要判断左边界的数是不是0,是0则计数器-1,滑动到计数器的值等于k}sum=max(sum,r-l+1);//更新sum的值}return sum;}
};

     相信看完代码之后大家会发现,固定长度的滑动窗口,while循环的条件都是比较长度,而非固定长度的滑动窗口,虽然不是比较长度,但也有其他的条件进行限制,具体什么条件就需要看具体的题目了。

3.2 leetcode非固定窗口题目及模板总结

3.2.1 字符串的排列

class Solution {
public:bool checkInclusion(string s1, string s2) {//滑动窗口unordered_map<char, int> win, need;//将子串的元素压入哈希表for (auto &i : s1){++need[i];}//定义边界int right = 0, left = 0, n = s1.size(), num = s2.size(), count = 0;//进行滑动窗口for(;right < num;right++){//如果可以在哈希表中找到元素就压入到窗口中if (need.find(s2[right]) != need.end()){++win[s2[right]];if (need[s2[right]] == win[s2[right]]){++count;}}while(right - left + 1 >= n){if (count == need.size()){return true;}//缩小窗口if (need.find(s2[left]) != need.end()){//缩小窗口的步骤其实跟扩大窗口的步骤是相反的if (need[s2[left]] == win[s2[left]]){--count;}--win[s2[left]];}left++;}}return false;}
};
3.2.2 最短超串

class Solution {
public:vector<int> shortestSeq(vector<int>& big, vector<int>& small) {int n=big.size();//数组长度unordered_map<int,int>win,need;//定义两个哈希表,一个存储子数组,一个存储窗口for(auto a:small)//将子数组压入哈希表中便于查找和比较{need[a]++;}int l=0,r=0;//定义双指针(变量)作边界vector<int>ans;//定义一个数组用来存储最短子数组的左端点和右端点int count=0;//计数器,用来计算长数组出现子数组元素的次数,便于条件处理int len=INT_MAX;//可以不断更新的长度len//开始滑动窗口for(;r<n;r++){//扩大窗口if(need.find(big[r])!=need.end()){win[big[r]]++;if(need[big[r]]==win[big[r]])//防止重复{count++;  }}//开始缩小窗口while(count==need.size()){//进行获取最短超串if(len>r-l+1)//判断下一个窗口是否比上一个窗口长度小,如果小则更新len和ans数组的值{ans={l,r};len=r-l+1;}如果此时窗口左端的值在子数组的哈希表中耀进行特殊处理if(need.find(big[l])!=need.end()){if(need[big[l]]==win[big[l]]){count--;}win[big[l]]--;}l++;}}return ans;}
};
3.3.3 非固定窗口模板
int slidingWindow(vector<int> nums) {int n = nums.size();int ans = 0;// 记录窗口内的元素及其个数,非必要map<int, int> um;// l:窗口左边界; r:窗口右边界int l = 0, r = 0;// r 指针负责探索新的区间,直到搜索到nums的某末尾for(;r < n;r++) {um[r]++;// 如果区间不满足条件,l指针右移,窗口收缩while (区间[l, r] is Invalid) {um[l]--;l++;}// 此处处理结果, deal with(ans, 区间[l, r])res = max(ans, r - l + 1); // 或者res = min(ans, r - l + 1);}return ans;
}

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

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

相关文章

JavaSE 泛型

目录 1 泛型类的定义1.1 为什么需要泛型1.2 泛型的概念1.3 泛型的分类 2 泛型类2.1 泛型类的定义2.2 泛型类的例子2.3 泛型类的实例化2.3.1 实例化语法2.3.2 裸类型(Raw Type) 2.4 泛型类的定义-类型边界2.5 泛型类的使用-通配符(Wildcards)2.5.1 基本概念2.5.2 通配符-上界2.5…

HTML_有哪些字体样式及使用

文章目录 &#x1f431;‍&#x1f409;一、字体样式的基本概念&#xff1a;&#x1f431;‍&#x1f409;二、css字体样式属性有&#xff1a;&#x1f923;1、设置字体类型&#xff08;font-family&#xff09;&#x1f923;2、设置字体大小&#xff08;font-size&#xff09;…

【lesson19】MySQL内置函数(2)数学函数和其它函数

文章目录 数学函数函数使用 其它函数函数使用 数学函数 函数使用 其它函数 函数使用 user() 查询当前用户 database()显示当前正在使用的数据库 password()函数&#xff0c;MySQL数据库使用该函数对用户加密 md5(str)对一个字符串进行md5摘要&#xff0c;摘要后得到一个32…

VueStu02-创建一个Vue实例

一、核心步骤 1.准备容器 准备一个盒子div。 2.引包 从官网引包&#xff0c;有开发版本和生产版本之分。 3.创建Vue实例 创建一个Vue实例&#xff0c;new Vue()。 4.指定配置项 指定配置项&#xff0c;用于渲染数据 。 el&#xff1a;指定挂载点。知道自己将来要管理的是…

Axure的交互以及情形的介绍

一. 交互 1.1 交互概述 通俗来讲就是&#xff0c;谁用了什么方法做了什么事情&#xff0c;主体"谁"对应的就是axure中的元件&#xff0c;"什么方法"对应的就是交互事件&#xff0c;比如单击事件、双击事件&#xff0c;"什么事情"对应的就是交互…

Temu、Shein、OZON测评自养号,IP和指纹浏览器的优缺点分析

随着全球电子商务的飞速发展&#xff0c;跨境电商环境展现出巨大的潜力和机遇。然而&#xff0c;跨境卖家们也面临着更激烈的竞争、更严格的规定和更高的运营成本等挑战。为了在这个环境中脱颖而出&#xff0c;一些卖家尝试使用自动脚本程序进行浏览和下单。然而&#xff0c;这…

JAVA分库分表

1.1为什么需要分库分表 随着平台的发展&#xff0c;平台的数据会越来越多。当表中的数据量过多时&#xff0c;数据库的性能会下降严重&#xff0c;很有可能会把系统给拖垮。类似于分而治之的思想&#xff0c;将大的问题拆分成小的问题&#xff0c;从而提高效率。通过将数据分散…

3分钟让你学会axios在vue项目中的基本用法(建议收藏)

目录 Axios Axios简介 一、axios是干啥的 二、安装使用 三、Axios请求方式 1、axios可以请求的方法&#xff1a; 2、get请求 3、post请求 4、put和patch请求 5、delete请求 6、并发请求 四、Axios实例 1、创建axios实例 2、axios全局配置 3、axios实例配置 4、…

CTF命令执行部分总结

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白&#xff0c;正在自学ing。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐️。 ⭐️此后如竟没有炬火&#xff0c;我便是唯一的光。⭐️ 关于…

矩阵式键盘实现的电子密码锁

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14P1^4; //将P14位定义为P1.4引脚 sbit P15P1^5; //将P15位定义为P1.5引脚 sbit P16P1^6; //将P16位定义为P1.6引脚 sbit P17P1^7; //将P17位定义为P1.7引脚 sbit soundP3^7; //将so…

[AutoSar]基础部分 RTE 01 介绍

目录 关键词平台说明一、什么是RTE二、RTE的主要功能 关键词 嵌入式、C语言、autosar、EcuM、wakeup、flex 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、什么是RTE RTE&#xff08;Run-Time Environment&…

【python】进阶--->并发编程之线程(二)

一、线程的生命周期 新建 : 创建线程经过初始化,进入就绪状态 就绪 : 等待操作系统调度,调度后进入运行状态运行 阻塞 : 暂停运行,解除阻塞后进入就绪等待重新调度 消亡 : 线程执行完毕或者异常终止 可能有3种情况从运行到阻塞 : 同步 : 线程中获取同步锁,但是资源已经被其他…

车辆跟踪及测距

车辆跟踪及测距是一种现代化的技术手段&#xff0c;通过使用各种传感器和技术设备&#xff0c;能够实现车辆的实时监控和测距。这些技术手段包括GPS全球定位系统、雷达、激光等&#xff0c;它们可以帮助我们更好地了解车辆的位置和行驶情况。在本文中&#xff0c;我们将从以下几…

LeetCode - 460 LFU缓存(Java JS Python)

题目来源 460. LFU 缓存 - 力扣&#xff08;LeetCode&#xff09; 题目描述 请你为 最不经常使用&#xff08;LFU&#xff09;缓存算法设计并实现数据结构。 实现 LFUCache 类&#xff1a; LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key)…

【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作

Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了&#xff0c;所以这周开始记录下来&#xff0c;也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐 文章介绍 这篇文章于2018年发表在AAAI&…

手把手教你使用Cypress进行端到端测试

一、引言 Cypress是一个流行的端到端测试框架&#xff0c;它提供了一个全面的解决方案&#xff0c;可以测试任何在浏览器中运行的内容。不论你是想为一个小型项目添加测试&#xff0c;还是在大型企业级应用中进行端到端测试&#xff0c;Cypress都是一个不错的选择。本文将会手…

智能优化算法应用:基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于阿基米德优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.阿基米德优化算法4.实验参数设定…

国家开放大学 河南开放大学形成性考核 平时作业 统一参考资料

试卷代号&#xff1a;1258 房屋建筑混凝土结构设计 参考试题 一、单项选择题&#xff08;每小题2分&#xff0c;共计40分&#xff09; 1.( )是将框架结构中的部分跨间布置剪力墙或把剪力墙结构的部分剪力墙抽掉改为框架承重。 A.梁板结构体系 B.框…

评价机器学习模型的指标

为了衡量一个机器学习模型的好坏&#xff0c;需要给定一个测试集&#xff0c;用模型对测试集中的每一个样本进行预测&#xff0c;并根据预测结果计算评价分数。 对于分类问题&#xff0c;常见的评价标准有准确率、精确率、召回率和F值等。给定测试集 &#x1d4af; {(&#x1…

一款电压检测LVD

一、基本概述 The TX61C series devices are a set of three terminal low power voltage detectors implemented in CMOS technology. Each voltage detector in the series detects a particular fixed voltage ranging from 0.9V to 5.0V. The voltage detectors consist…