刷题训练之滑动窗口

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练掌握滑动窗口算法,并且能把下面的题目做出

> 毒鸡汤:人生就像一场马拉松比赛,不是看谁跑得最快,而是看谁坚持到最后。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言分析

        最早博主续写了牛客网130道题,这块的刷题是让同学们快速进入C语言,而我们学习c++已经有一段时间了,知识储备已经足够了但缺少了实战,面对这块短板博主续写刷题训练,针对性学习,把相似的题目归类,系统的刷题,而我们刷题的官网可以参考:​​​​​​

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

而今天我们的板块是双指针问题。

⭐知识讲解

滑动窗口本质上是两个指针所固定一个窗口而这个窗口可以移动。

⭐经典题型

🌙topic-->1

题目原型:. - 力扣(LeetCode)

题目分析:

在数组中中找出最短的距离,而这个区间的数字之和要大于等于target

讲解算法原理:

编写代码:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int sum = 0;int len = INT_MAX;for(int left = 0,right = 0; right < n; right++){// 进窗口sum = sum + nums[right];// 判断while(sum >= target){// 更新结果len = min(len,right- left + 1);// 出窗口sum = sum - nums[left++];}}return len == INT_MAX ? 0 : len;}
};

细节注意:

1.有可能数组没有我们的值,这里我们len就最开始定义成最大值

2.如果没有最大值我们返回0

🌙topic-->2

题目原型:. - 力扣(LeetCode)

题目分析:

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

讲解算法原理:

编写代码:

class Solution {
public:int lengthOfLongestSubstring(string s) {// 使用数组来模拟哈希表int hash[128] = {0};// 定义窗口左右端int left = 0;int right = 0;// 计算字符串长度int n = s.size();int ret = 0;// 循环while(right < n){// 存入hash表中,进入窗口hash[s[right]]++;// 判断while(hash[s[right]] > 1){// 出窗口hash[s[left++]]--;}// 计算结果ret = max(ret,right - left + 1);// 让下一个元素进入right++;}// 返回return ret;}
};

🌙topic-->3

题目原型:. - 力扣(LeetCode)

题目分析:

在一个数组中,元素只有 1 和 0 ,给定一个K值,这个K值是可以在数组中改变 0 的个数的多少,在改变数组时,需要求出连续 1 的最长值

讲解算法原理:

编写代码:

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int n = nums.size();vector<int> P(n + 1);for (int i = 1; i <= n; ++i) {P[i] = P[i - 1] + (1 - nums[i - 1]);}int ans = 0;for (int right = 0; right < n; ++right) {int left = lower_bound(P.begin(), P.end(), P[right + 1] - k) - P.begin();ans = max(ans, right - left + 1);}return ans;}
};

🌙topic-->4

题目原型:. - 力扣(LeetCode)

题目分析:

可以减去左右数组的元素值,找出满足最小值的减的次数

讲解算法原理:

编写代码:

class Solution {
public:int minOperations(vector<int>& nums, int x) {// 先计算数组和的大小int sum = 0;for(int a : nums)sum = sum + a;int target = sum - x;// 细节处理if(target < 0)return -1;int ret = -1;for(int left = 0,right = 0,tmp = 0;right < nums.size();right++){// 进窗口tmp = tmp + nums[right];// 判断while(tmp > target){// 出窗口tmp = tmp - nums[left++];}// 更新结果if(tmp == target)ret = max(ret,right - left + 1);}if(ret == -1)return ret;elsereturn nums.size() - ret;}
};

 🌙topic-->5

题目原型:904. 水果成篮 - 力扣(LeetCode)

题目分析:

可以采摘最多棵水果树,保证最多两种水果种类(必须是连续的)

讲解算法原理:

编写代码:

class Solution {
public:int totalFruit(vector<int>& f) {int hash[100001] = {0}; // 统计每种水果的个数int ret = 0; // 计算最多水果个数for(int left = 0,right = 0,kinds = 0;right < f.size();right++){// 维护水果种类if(hash[f[right]] == 0)kinds++;// 进窗口hash[f[right]]++;while(kinds > 2) // 判断{// 出窗口hash[f[left]]--;if(hash[f[left]] == 0)kinds--;left++;}// 更新结果ret = max(ret,right - left + 1);}return ret;}
};

🌙topic-->6

题目原型:438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

题目分析:

在 s 中返回跟 p 异位词的索引,不可缺少。 

讲解算法原理:

编写代码:

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> ret; // 用数组来存储结果// 第一个hash桶来存储 p 字符串int hash1[26] = { 0 };int m = p.size();for(auto e: p) // 存入hash1[e - 'a']++;// 第二个hash桶来存储每个字符出现的次数int hash2[26] = { 0 };int count = 0; // 计算字符种类次数for(int left = 0,right = 0;right < s.size();right++){char in = s[right];// 进窗口hash2[in - 'a']++;// 维护字符种类if(hash2[in - 'a'] <= hash1[in - 'a'])count++;// 判断if(right -left + 1 > m){char out = s[left++];// 维护字符种类if(hash2[out - 'a'] <= hash1[out - 'a'])count--;// 出窗口hash2[out - 'a']--;}// 更新结果if(count == m)ret.push_back(left);// 尾插}return ret;}
};

🌙topic-->7

题目原型:30. 串联所有单词的子串 - 力扣(LeetCode)

题目分析:

在 s 中找区间,这个区间必须是连续的,s 中的 串联子串 是指一个包含  words 中所有字符串以任意顺序排列连接起来的子串。返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

讲解算法原理:

编写代码:

class Solution
{
public:vector<int> findSubstring(string s, vector<string>& words){vector<int> ret; // 用来保存结果unordered_map<string, int> hash1; // 保存 words ⾥⾯所有单词的频次for (auto& s : words) hash1[s]++;int len = words[0].size(), m = words.size();for (int i = 0; i < len; i++) // 执⾏ len 次{unordered_map<string, int> hash2; // 维护窗⼝内单词的频次for (int left = i, right = i, count = 0; right + len <= s.size();right += len){// 进窗⼝ + 维护 countstring in = s.substr(right, len);hash2[in]++;if (hash1.count(in) && hash2[in] <= hash1[in]) count++;// 判断if (right - left + 1 > len * m){// 出窗⼝ + 维护 countstring out = s.substr(left, len);if (hash1.count(out) && hash2[out] <= hash1[out]) count--;hash2[out]--;left += len;}// 更新结果if (count == m) ret.push_back(left);}}return ret;}

 🌙topic-->8

题目原型:76. 最小覆盖子串 - 力扣(LeetCode)

题目分析:

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

讲解算法原理:

编写代码:

class Solution
{
public:string minWindow(string s, string t){int hash1[128] = { 0 }; // 统计字符串 t 中每⼀个字符的频次int kinds = 0; // 统计有效字符有多少种for (auto ch : t)if (hash1[ch]++ == 0) kinds++;int hash2[128] = { 0 }; // 统计窗⼝内每个字符的频次int minlen = INT_MAX, begin = -1;for (int left = 0, right = 0, count = 0; right < s.size(); right++){char in = s[right];if (++hash2[in] == hash1[in]) count++; // 进窗⼝ + 维护 countwhile (count == kinds) // 判断条件{if (right - left + 1 < minlen) // 更新结果{minlen = right - left + 1;begin = left;}char out = s[left++];if (hash2[out]-- == hash1[out]) count--; // 出窗⼝ + 维护 count}}if (begin == -1) return "";else return s.substr(begin, minlen);}
};

🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

又一个城市火了,媒介盒子盘点城市爆火原因

近日&#xff0c;“甘肃天水麻辣烫”在各大平台频频登上热搜榜&#xff0c;甘肃当地也及时接住了这泼天富贵&#xff0c;开通“麻辣烫专线”、机场高铁免费接、免费送门票等。这些措施似曾相识&#xff0c;因为在天水前&#xff0c;已经有淄博和哈尔滨这两个城市的案例可以供天…

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…

中文数字与阿拉伯数字:数字符号的文化交融

title: 中文数字与阿拉伯数字&#xff1a;数字符号的文化交融 date: 2024/3/21 17:46:31 updated: 2024/3/21 17:46:31 tags: 数字起源符号系统差异中文数字特点阿拉伯数字优势转换技术应用文化交流融合数字表达互通 中文数字与阿拉伯数字的关系起源&#xff1a; 中文数字是古…

硬盘、内存、缓存(CPU)和寄存器 空间大小与存取速度的区别及设计原理

一、寄存器和存储器是不同的 很多人会将 寄存器 与 存储器 二者混淆&#xff0c;认为它们是同一个东西。但并不是&#xff01;&#xff01; 寄存器是CPU上的一个模块 存储器是 内存硬盘的统称 二、存取速度的比较 CPU(包含寄存器&#xff0c;缓存) > 内存 > 硬盘 内…

代码学习第24天----回溯算法

随想录日记part24 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.10 主要内容&#xff1a;回溯算法在代码学习中尤其重要&#xff0c;所以今天继续加深对其的理解&#xff1a;1&#xff1a;递增子序列 &#xff1b;2.全排列 &#xff1b;3.全排列II 491.递…

C++ list详解及模拟实现

目录 本节目标 1. list的介绍及使用 1.2 list的使用 2.list的模拟实现 1.对list进行初步的实现 2.头插和任意位置的插入 3.pos节点的删除&#xff0c;头删&#xff0c;尾删 4.销毁list和析构函数 5.const迭代器 6.拷贝构造和赋值操作 3.完整代码 本节目标 1. list的…

如何在Ubuntu使用宝塔面板搭建hadsky轻论坛并发布到公网可随时访问

文章目录 推荐前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 推荐 前些天发现了…

IP证书是什么?怎么申请?

IP证书&#xff0c;通俗来说&#xff0c;就像是专门给互联网上的一个门牌号码&#xff08;公网IP地址&#xff09;发放的“安全身份证”。这个证书主要是用来给那些通过IP地址直接访问的网站或服务提供HTTPS加密保护的。通常情况下&#xff0c;SSL证书是颁发给域名&#xff08;…

社交媒体的未来:探讨Facebook的发展趋势

引言 在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在不断地追求创新&#xff0c;以满足用户日益增长的需求和适应科技发展的变革。本文将探讨Facebook在未来发展中可能面临的挑战和应对…

模方软件匀色功能是灰色的不能点是什么原因?

问题如图 模方软件试用版没有匀色权限&#xff0c;正式版才可以用 。 下方链接有1个月的授权&#xff0c;有需要可以点开&#xff0c;软件正式版的可以使用匀色这个功能。https://item.jd.com/10037263088236.html

不会吧!不会吧!居然还有人不知道这个???

在2024年3月4日&#xff0c;由Anthropic推出了Claude3系列的大语言模型&#xff1a;该系列包括三种最先进的型号&#xff08;按功能升序排列&#xff09;&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus。每个后续型号都提供越来越强大的性能&#xff0c;允许用…

用JDBC游标的方式导出mysql数据以及springboot打包成exe程序实践

用JDBC实现游标查询&#xff0c;关键代码在于 Statement 的 fetchSize 属性的设置。 ExportDataService import cn.hutool.core.io.FileUtil; import cn.hutool.core.text.csv.CsvUtil; import cn.hutool.core.text.csv.CsvWriter; import cn.hutool.core.util.StrUtil; impo…

许战海战略文库|橋頭品牌突破区域局限打透全国市场的4个建议

自宣统元年(公元1908年)起&#xff0c;重庆南岸区海棠溪古石桥边诞生了一家传奇火锅店——桥头火锅。凭借深厚的文化底蕴和独特的风味&#xff0c;历经百年沉淀桥头火锅已成为南岸区乃至中华餐饮文化中的璀璨明珠。 桥头火锅不仅荣获了“中华老字号”和“中国名菜”两项殊荣&a…

生产者消费者模式

生产者消费者模式 如何用 BlockingQueue 实现生产者消费者模式如何用 Condition「条件变量」 实现生产者消费者模式如何用 wait/notify 实现生产者消费者模式扩展 生产者消费者模式&#xff0c;生产者消费者模式是多线程编程中非常常见的一种设计模式&#xff0c;它被用于解决生…

PyGWalker:Python中的Tableau,数据可视化变得如此简单!

文章目录 1介绍2 安装3 使用4 将数据可视化导出为代码5 总结 1介绍 在数据分析和可视化的领域&#xff0c;Tableau凭借其强大的功能和直观的界面&#xff0c;一直以来都是专业人士的首选工具。然而&#xff0c;对于许多用户而言&#xff0c;Tableau的封闭性和高昂的成本使其难…

从0到1:Java构建高并发、高可用分布式系统的实战经验分享

文章目录 引言基础架构选择与设计微服务架构分布式储存与计算 高并发处理策略异步处理与消息队列并发控制与资源隔离 高可用性设计与故障恢复冗余与集群化容错与自我修复监控与运维自动化 引言 随着互联网业务的快速发展和技术迭代升级&#xff0c;作为Java架构师&#xff0c;…

【MySQL】对数据库的操作以及数据库备份相关操作

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

有ai写文案的工具吗?分享5款好用的工具!

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已渗透到我们生活的方方面面&#xff0c;包括内容创作领域。AI写文案的软件以其高效、便捷的特点&#xff0c;正逐渐受到广大内容创作者、营销人员、甚至普通用户的青睐。本文将为您盘点几款热门的AI写文案软件&…

NetSuite 固定资产Write-Off的撤回操作

之前我们有说到如果是Sale了固定资产后发现有误&#xff0c;需要撤回操作该如何处理。这篇文章来补充一下&#xff0c;如果是误Write-Off了一个固资该如何处理&#xff0c;其逻辑与Sale的撤回基本一致&#xff0c;但是少了删除Sale Invoice的步骤。 我们用一个实际的例子来进行…

HTML5:七天学会基础动画网页(end)

想了想还是有一点东西还没说&#xff0c;当然这块内容也比较简单&#xff0c;就是当我们有一段完整素材时&#xff0c;如下: 我在网上随便找的素材&#xff0c;当然我们平时在使用素材时要注意尊重他人的著作权&#xff0c;不管是字体图片还是别的&#xff0c;不然后面不小心侵…