蓝桥杯备战刷题-滑动窗口

在这里插入图片描述

今天给大家带来的是滑动窗口的类型题,都是十分经典的。
1,无重复字符的最长子串
在这里插入图片描述
看例三,我们顺便来说一下子串和子序列的含义
子串是从字符串里面抽出来的一部分,不可以有间隔,顺序也不能打乱。
子序列也是从字符串里面抽出来一部分,可以有间隔,顺序也不能打乱。
如图
在这里插入图片描述
可以看出来,如果是子序列问题,一般会比子串要更难一点。
不扯了,接下来进行这道题题目的讲解
第一种思路,也就是最简单的思路
那就是暴力求解。因为这道题本来就是只含有数字,字母符号,空格等组成。查看ASCII表,可以发现范围在128以内。当然我们也可以创建一个哈希表用来记录。然后分别从字符串的每个位置向后寻找,保留一个最大值即可。

class Solution {
public:
int lengthOfLongestSubstring(string s) {int ret = 0; // 记录结果int n = s.length();// 1. 枚举从不同位置开始的最⻓重复⼦串// 枚举起始位置for (int i = 0; i < n; i++){// 创建⼀个哈希表,统计频次int hash[128] = { 0 };// 寻找结束为⽌for (int j = i; j < n; j++){hash[s[j]]++; // 统计字符出现的频次if (hash[s[j]] > 1) // 如果出现重复的break;// 如果没有重复,就更新 retret = max(ret, j - i + 1);}}// 2. 返回结果return ret;
}
};

运行后如图
在这里插入图片描述

还有一种方式就是滑动窗口,滑动窗口的思想就是两个同方向移动的指针,然后判断指针范围内我们所要寻找的,或者要统计的。
使用两个指针,left和right。
在这里插入图片描述
如果right和left中的元素没有重复值,那right就继续右移,设置一个max变量保存最长数,在窗口向后滑动时不断更新最大值。如果有重复的元素,就让left右移,直到窗口中没有重复元素为止,这样只需要遍历一遍就可以知道最长字符串的长度。
代码如下

class Solution {
public:
int lengthOfLongestSubstring(string s) {int hash[129] = { 0 };int left = 0, right = 0;int max = 0;while (right < s.size()){hash[s[right]]++;          while (hash[s[right]] != 1)//如果某个元素的数量大于2{hash[s[left]]--;//就右移left,直到该元素数量恢复为1left++;}if (right - left + 1 > max)//更新最大值{max = right - left + 1;}right++;}cout << max;return max;
}
};

在这里插入图片描述

暴力解法的时间复杂度明显为O(N2),而滑动窗口的时间复杂度为O(N)。
第二道题
最大连续1的个数
在这里插入图片描述
这道题很有意思的地方就是可以翻转,将0翻转为1。
这道题还是可以暴力解法,和第一道题很是类似,就是多了可以翻转这一步。但是我们可以这样想,一直遍历1,如果是0就翻转,上道题我们判断的是是否有重复的字符,这道题呢?我们不用想的那么复杂,还是设置两个变量left和right,同样遇到1就继续++right,如果遇到0,就判断窗口内0的个数,如果个数大于K就向右移动left,直到窗口内0的个数小于k即可,这样就只需要遍历一遍数组即可得出答案。
用动态图来演示一下
在这里插入图片描述

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left=0,right=0;int ret=0;while(right<nums.size())//确定范围{if(nums[right]==0){k--;if(k<0)//k表示还可以翻转的0的个数{while(k!=0){if(nums[left]==0){k++;//如果left跳过了一个0,就++可翻转数left++;}else{left++;}}}}right++;ret=max(right-left,ret);//记录最大值}return ret;}
};

运行后如图
在这里插入图片描述
第三题
水果成篮
在这里插入图片描述题目很长,但是其实很容易理解,最主要的一点就是不能超过两种数,其实就是最长不重复子串的改版,这道题找的是最长只存在两种元素的最长子串的长度。
至于思路还有做题方法可以说和上边两道题很像。
用一个例子说明一下,这道题的暴力解法还是不停遍历,从数组的每一个位置开始,然后保留最大值。
在这里插入图片描述
代码如下

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100001] = { 0 };int left = 0, right = 0;int kind = 0;int ret = 0;while (right < fruits.size()){if (hash[fruits[right]] == 0){kind++;}hash[fruits[right]]++;while(kind>2){hash[fruits[left]]--;if(hash[fruits[left]]==0){kind--;}left++;}ret = max(right-left+1, ret);right++;}return ret;
}
};

这里我们知道数据的范围,所以直接用一个数组代替哈希表。前三题的思路都十分相似。
第四题
找到字符串中所有的字母异位词

在这里插入图片描述
看一看例子,就知道异位词的含义了。
在这里插入图片描述
这道题的思路也很明显,和前边的题目又有一点不一样,我们首先要记录p字符串中的字母,然后从s字符串中利用滑动窗口查找,如果滑动窗口中的字符符合p字符串中所有字符个数。如果不符合,那就移动right和left。当然,p字符串的长度是一定的,所以滑动窗口的长度也是一定的。
我们可以用两个数组模拟哈希表,一个统计p字符串中的每个字母的个数,另一个是统计每一个字符出现的个数。
在滑动的时候,如果符合就++count,然后设置一个vector数组,将符合的位置(就是left的位置)放进数组中。然后将该数组返回。

class Solution
{
public:
vector<int> findAnagrams(string s, string p)
{vector<int> ret;int hash1[26] = { 0 }; // 统计字符串 p 中每个字符出现的个数for(auto ch : p) hash1[ch - 'a']++;int hash2[26] = { 0 }; // 统计窗⼝⾥⾯的每⼀个字符出现的个数int m = p.size();for(int left = 0, right = 0, count = 0; right < s.size(); right++){char in = s[right];// 进窗⼝ + 维护 countif(++hash2[in - 'a'] <= hash1[in - 'a']) count++;if(right - left + 1 > m) // 判断{char out = s[left++];// 出窗⼝ + 维护 countif(hash2[out - 'a']-- <= hash1[out - 'a']) count--;}// 更新结果if(count == m) ret.push_back(left);}return ret;
}
};

运行后如图
在这里插入图片描述

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

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

相关文章

Vue+SpringBoot打造个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

【周总结周末日常】

周总结 完成任务开发并且与前端联调通过 完成已开发功能的冒烟测试 修复测试中出现的一些数据显示问题 2024/3/10 晴 温度适宜 这周天气比上周好多了&#xff0c;最起码见到好几次太阳 周六在世纪公园溜达一会儿&#xff0c;偶尔呼吸下大自然&#xff0c;挺棒的…

【QT】创建第一个QT程序

下面的前7个可以先不看&#xff0c;直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分&#xff1a;应用程序类&#xff0c;窗口类应用程序类个数&#xff1a;有且只有一个QApplication a;如何查看类对应的模块&#xff1a;光标移动到类上&#xff0c;F1qmake模块的名字 2. …

【设计模式】(四)设计模式之工厂模式

1. 工厂模式介绍 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式有三种实现方式&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 2. 工厂方…

前后端分离项目,如何解决跨域问题?

跨域问题是前后端分离项目中非常常见的一个问题&#xff0c;举例来说&#xff0c;编程猫学习网站的前端服务跑在 8080 端口下&#xff0c;后端服务跑在 9002 端口下&#xff0c;那么前端在请求后端接口的时候就会出现跨域问题。 403 Forbidden 是HTTP协议中的一个状态码&#x…

华容道问题求解_详细设计(五)之hash值和回放功能

&#xff08;续上文&#xff09; 布局的hash 值计算 笔者也参考了之前的一些文章&#xff0c;很多文章提到了怎么节省存贮空间来查找最优解&#xff0c;这不是笔者的目的。笔者的目的比较单一&#xff0c;就是找到最优解就行了。因此并没有在存贮上面进行过多的优化&#xff…

消息队列 MQ

文章目录 1. MQ 相关概念1.1 什么是 MQ1.2 为什么要用 MQ1.3 MQ 分类1.4 MQ 的选择 1. MQ 相关概念 1.1 什么是 MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#x…

阿里云DSW做AI绘画时的显卡选择A10?V100?

V100是Volta架构&#xff0c;A10是Ampere架构&#xff0c;架构上讲A10先进点&#xff0c;其实只是制程区别&#xff0c;用起来没区别。 V100是HBM的内存读取&#xff0c;带宽大&#xff0c;但是DDR5的。 二块卡都是全精度为主的算力卡&#xff0c;半精度优势不明显。 需要用…

FPN(Feature Pyramid Network)

参考&#xff1a; 【目标检测】FPN(Feature Pyramid Network) - 知乎 Feature pyramid network是CVPR2017年的一篇文章&#xff0c;它在目标检测中融入了特征金字塔&#xff0c;提高了目标检测的准确率&#xff0c;尤其体现在小物体的检测上。 1. 动机(Motivation) 识别不同…

【读书笔记】针对ICS的ATTCK矩阵详解(一)

Techniques - ICS | MITRE ATT&CKhttps://attack.mitre.org/techniques/ics/ 一、初始访问&#xff08;Initial Access&#xff09; 该阶段&#xff1a;攻击者正在尝试进入ICS环境。 初始访问包括攻击者可能用作入口向量&#xff0c;从而可以在 ICS 环境中获得初始立足点的…

pytorch实现分割模型TransUNet

TransUNet是一个非常经典的图像分割模型。该模型出现在Transformer引入图像领域的早期&#xff0c;所以结构比较简单&#xff0c;但是实际上效果却比很多后续花哨的模型更好。所以有必要捋一遍pytorch实现TransUNet的整体流程。 首先&#xff0c;按照惯例&#xff0c;先看一下…

逼疯快递员的送货上门,谁来背锅?

快递上门的问题近几年来一直争论不休。 最近&#xff0c;随着新修订的《快递市场管理办法》正式实施&#xff0c;这个话题又成为了焦点。 消费者希望快递能够送上门省去麻烦&#xff0c;快递员希望统一送到代收点提高效率。 是消费者要求太高&#xff1f;快递员太过怠慢&…

[金三银四] 系统调用相关

2.36 系统调用的详细流程 Linux 在x86上的系统调用通过 int 0x80 实现&#xff0c;用系统调用号来区分入口函数。操作系统实现系统调用的基本过程是&#xff1a; 应用程序调用库函数&#xff08;API&#xff09;&#xff1b;API 将系统调用号存入寄存器&#xff08;EAX&#…

CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

2.JavaWebMySql基础

导语&#xff1a; 一、数据库基本概念 1.什么是数据库 2.关于MySql数据库 二、MySQL的安装与卸载 安装步骤&#xff1a; 卸载步骤&#xff1a; 三、MySQL服务操作 1.服务启动和关闭&#xff1a; 2.登录和退出MySQL&#xff1a; 3.服务自启动&#xff1a; 4.命令行登…

Python实现线性查找算法

Python实现线性查找算法 以下是使用 Python 实现线性查找算法的示例代码&#xff1a; def linear_search(arr, target):"""线性查找算法:param arr: 要搜索的数组:param target: 目标值:return: 如果找到目标值&#xff0c;返回其索引&#xff1b;否则返回 -1…

【玩转Linux】有关Linux权限

目录 一.Linux权限的概念 1. 权限的本质 2.Linux中的用户 3.Linux中的权限管理 (1)文件访问者的分类 (2)文件类型和访问权限&#xff08;事物属性&#xff09; ①文件基本权限 ②文件权限值的表示方法 (3)文件访问权限的相关设置方法 ① 用 户 表 示 符 / - 权 …

Vue3 快速上手从0到1,两小时学会【附源码】

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为vue3的学习笔记 项目需要使用到的依赖 npm install axios npm install nanoid vue-router npm install pinia npm install mitt 源码&#xff1a;Gitee 运行 npm install npm run dev需要运…

MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X

CleanMyMac X是一款专业的Mac清理软件&#xff0c;具备多种强大功能。首先&#xff0c;它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包&#xff0c;从而快速释放电脑内存。其次&#xff0c;CleanMyMac X可以轻松管理和升级Mac上的应用&#xff0c;同时强力卸载恶意软件并修…

windows使用pyenv

1、前言 虽然anaconda比pyenv相比有更好的python安装体验&#xff0c;但是有一个比较严重的问题的就是&#xff0c;他的python版本跨度不够大&#xff0c;一些老一些的项目的python版本找不到&#xff0c;比如py12306要求的python版本是3.6&#xff0c;在anaconda却找不到这个版…