C++算法——滑动窗口

一、长度最小的子数组

1.链接

209. 长度最小的子数组 - 力扣(LeetCode)

2.描述

3.思路

本题从暴力求解的方式去切入,逐步优化成“滑动窗口”,首先,暴力枚举出各种组合的话,我们先让一个指针指向第一个,然后往后逐一遍历区间,也就是穷举出所有的子数组,但根据题目要求,当我们穷举出大于或者等于target的区间时,右边指针再向后遍历穷举的结果将没有意义,所以不需要再去往后走,而是进行下一轮遍历(前提是本题中数据全是正整数),当左指针往后走一步后,穷举的思路需要我们从头再走一次重复的数据,此时我们对其进行优化,定义一个sum值去记录区间数据,就可以不需要再次遍历一次,经过优化后,我们会发现,解题思路就变成了:

定义两个左右指针,一起从头往前走,并且记录两个指针区间的和sum,right指针往后,当大于等于目标值时,则停下记录长度,然后left走一步,进行判断是否仍然满足大于等于目标值,若是满足则让left继续走,当长度出现比原先短的区间时,进行更新最小区间的长度,left走到小于目标值时,让right进行往前走,直到right遍历完一遍数组,这种两个指针同向一起走的思路叫做“滑动窗口”

4.参考代码

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left = 0;int right = 0;int sum = nums[0];int len = 0;while(right < nums.size()){if(sum < target){++right;if(right < nums.size())sum+=nums[right];}else{len = len == 0 ? right-left+1 :  min(len,right - left + 1);if(len == 1) break;sum-=nums[left++];}}return len;}
};

二、无重复字符的最长子串

1.链接

3. 无重复字符的最长子串 - 力扣(LeetCode)

2.描述

3.思路

由于是对子串进行判断,子串是一段连续的区间,所以我们可以尝试采用滑动窗口的思路解决

满足窗口滑动的条件就是:判断窗口内是否有重复字符,可以利用哈希表去进行统计

当没有重复时则right往前走,当有重复时则left往前,这个过程中记录下最长的子串

4.参考代码

class Solution 
{
public:int lengthOfLongestSubstring(string s) {if(s.size() == 0){return 0;}int left = 0;int right = 0;int len = 0;set<char> hash;while(right < s.size()){if((hash.insert(s[right])).second)//插入成功意味着没有重复{right++;len = max(len,right-left);}else//出现重复{hash.erase(s[left++]);}}return len;}
};

三、最大连续1的个数|||

1.链接

1004. 最大连续1的个数 III - 力扣(LeetCode)

2.描述

3.思路

可以将题意转化为,在一段区间内,0的数量不能超过k个,利用滑动窗口去解决

当超过k个时,left往前走,直到将最前面的0给退出窗口,没有超过时,则right往前走,不断扩大窗口,过程中记录下窗口长度最大的值

4.参考代码

class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left = 0;int right= 0;int n = nums.size();int len = 0;while(right < n){while(right < n && (k != 0 || nums[right] == 1)){if(nums[right] == 0){k--;}right++;len = max(len,right-left);}while(left < n && k == 0){if(nums[left++] == 0)k++;}}return len;}
};

四、将x减到0的最小操作数

1.链接

1658. 将 x 减到 0 的最小操作数 - 力扣(LeetCode)

2.描述

3.思路

我们可以先将问题转换成,在数组内找到一段最长连续的子区间之和会刚好等于数组之和减去x的值

将问题变成在数组中找一段最长的连续子区间之和等于目标值的问题后,我们就可以使用滑动窗口的思路去解决,思路可以参考第一题“长度最小的子数组”

4.参考代码

class Solution 
{
public:int minOperations(vector<int>& nums, int x) {int n = nums.size();int sum = 0;for(auto n:nums){sum+=n;}int target = sum - x;if(target < 0) return -1;//找到最长的子区间int len = -1;for(int left = 0,right = 0,s = 0; right < n;right++ ){s += nums[right];//进窗口while(s > target)//出窗口{s-=nums[left++];}if(s == target){len = max(len,right-left+1);}}return len == -1 ? len : n-len;}
};

五、水果成篮

1.链接

904. 水果成篮 - 力扣(LeetCode)

2.描述

3.思路

根据题意,利用滑动窗口的思路,当窗口内的水果种类超过两种时则开始出窗口,过程中记录下窗口的长度,利用哈希表去进行统计

4.参考代码

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

六、找到字符串中所有字母异位词

1.链接

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

2.描述

3.思路

4.参考代码

class Solution 
{
public:vector<int> findAnagrams(string s, string p) {int hash1[26] = {0};int hash2[26] = {0};for(auto c:p){hash1[c-'a']++;}int m = p.size();vector<int> ret;for(int left = 0,right = 0,count = 0; right < s.size(); right++){char in = s[right];hash2[in - 'a']++;//入窗口if(hash2[in - 'a'] <= hash1[in - 'a']) count++;//维护countchar out = s[left];if(right-left+1 > m)//出窗口{if(hash2[out - 'a'] <= hash1[out - 'a']) count--;//维护counthash2[out - 'a']--;left++;}//判断目标if(count == m){ret.push_back(left);}}return ret;}
};

七、串联所有单词的子串

1.链接

30. 串联所有单词的子串 - 力扣(LeetCode)

2.描述

3.思路

4.参考代码

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {int len = words[0].size();unordered_map<string,int> m1;unordered_map<string,int> m2;vector<int> ret;for(auto& s:words) m1[s]++;for(int i = 0;i<len;i++)//以i位置为起点{for(int left = i,right = i+len-1,count = 0; right < s.size() ; right+=len)//滑动窗口{string in = s.substr(right-len+1,len);m2[in]++;//入窗口if(m2[in] <= m1[in]) count++;//维护countif(right-left+1 > len*words.size())//出窗口{string out = s.substr(left,len);if(m2[out] <= m1[out]) count--;m2[out]--;left+=len;}if(count == words.size()) ret.push_back(left);}m2.clear();}return ret;}
};

八、最小覆盖子串

1.链接

76. 最小覆盖子串 - 力扣(LeetCode)

2.描述

3.思路

有了前面的经验,不难想到这题该怎么用滑动窗口解决,根据题意分析,我们知道首先将t内的字符记录到哈希表hash1中,然后让滑动窗口的右侧不断的往前走,直到满足题目条件,即滑动窗口内的字符串包含了t内的字符,此时让left往前收缩,记录下最小的区间,然后直到不再满足条件后,让right继续往后找满足条件的子串,最终记录下最短的那个子串即可,当然,还有如何优化哈希比较的细节需要注意,以及对于如何记录下最短子串的考量

4.参考代码

class Solution {
public:string minWindow(string s, string t) {int n = s.size();int hash1[128] = {0};int hash2[128] = {0};for(auto& c : t)  hash1[c]++;int begin = -1; int len = s.size()+1;for(int left = 0,right = 0,count = 0;right < n;right++){char in = s[right];hash2[in]++;if(hash2[in] <= hash1[in]) count++;while(count == t.size()){if(right-left+1 < len){len = right-left+1;begin = left;}char out = s[left++];if(hash2[out] <= hash1[out]) count--;hash2[out]--;}}if(begin == -1) return "";else return s.substr(begin,len);}
};

总结

本章节主要整理了关于滑动窗口的算法思想,由简单到困难逐步递进,整理了八道相关例题以及思路解析提供参考,也可以通过链接去做

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

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

相关文章

“探秘数据结构:栈的奇妙魔力“

每日一言 兰有秀兮菊有芳&#xff0c;怀佳人兮不能忘。 —刘彻- 栈 栈的概念及结构 栈(Stack) &#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

AI图像重绘解决方案

高质量的图像素材往往成本高昂且制作周期长&#xff0c;给企业带来了不小的困扰。美摄科技凭借其领先的AI图像重绘解决方案&#xff0c;为企业提供了一种高效、便捷且成本可控的图像优化途径&#xff0c;助力企业重塑视觉形象&#xff0c;引领市场新风尚。 美摄科技的AI图像重…

探索设计模式的魅力:AI大模型如何赋能C/S模式,开创服务新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 AI大模型如何赋能C/S模式&#xff0c;开创服务新纪元 数字化飞速发展的时代&#xff0c;AI大模型…

【浅尝C++】STL第三弹=>list常用接口使用示例/list底层结构探索/list模拟实现代码详解

&#x1f3e0;专栏介绍&#xff1a;浅尝C专栏是用于记录C语法基础、STL及内存剖析等。 &#x1f3af;每日格言&#xff1a;每日努力一点点&#xff0c;技术变化看得见。 文章目录 list介绍list常用接口使用示例构造类函数迭代器属性与元素获取增删改操作 list底层结构探索list模…

数据结构——第5章 树和二叉树

1 二叉树 二叉树和树都属于树形结构&#xff0c;但两者互不包含。即二叉树不是特殊的树。 1.1 二叉树的基本概念 1.2 二叉树的顺序存储 仅适用于完全二叉树 #define MaxSize 100 typedef int ElemType; typedef struct TreeNode{ElemType value;//结点中的数据元素bool isE…

手机有线投屏到直播姬pc端教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…

LeetCode刷题记(一):1~30题

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…

蓝桥杯第793题——排水系统

题目描述 对于一个城市来说&#xff0c;排水系统是极其重要的一个部分。 有一天&#xff0c;小 C 拿到了某座城市排水系统的设计图。排水系统由 n 个排水结点&#xff08;它们从 1∼n 编号&#xff09;和若干个单向排水管道构成。每一个排水结点有若干个管道用于汇集其他排水…

读取信息boot.bin和xclbin命令

bootgen读Boot.bin命令 johnjohn-virtual-machine:~/project_zynq/kv260_image_ubuntu22.04$ bootgen -read BOOT-k26-starter-kit-202305_2022.2.bin xclbinutil读xclbin命令 johnjohn-virtual-machine:~/project_zynq/kv260_image_ubuntu22.04$ xclbinutil -i kv260-smartca…

整型之韵,数之舞:大小端与浮点数的内存之旅

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱’博客 所属栏目&#xff1a;人工智能 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 1.0 整形提升 我们先来看看代码。 int main() {char a 3;char b 127;char …

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

【PowerDesigner】PGSQL反向工程过程已中断

问题 反向工程过程已中断,原因是某些字符无法通过ANSI–&#xff1e;UTF-16转换进行映射。pg导入sql时报错&#xff0c;一查询是power designer 反向工程过程已中断&#xff0c;某些字符无法通过ANSI–>UTF-16转换进行映射&#xff08;会导致数据丢失&#xff09; 处理 注…

【LeetCode】热题100 刷题笔记

文章目录 T1 两数之和T49 字母异位词分组常用小技巧 T1 两数之和 链接&#xff1a;1. 两数之和 题目&#xff1a; 【刷题感悟】这道题用两层for循环也能做出来&#xff0c;但我们还是要挑战一下时间复杂度小于 O ( n 2 ) O(n^2) O(n2)的解法&#xff0c;不能因为它是第一道 …

docker部署实用的运维开发手册

下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestdocker-compose部署 vim docker-compose.yml version: 3 services:reference:container_name: referenceimage: registry.cn-beijing.aliyuncs.com/wuxingge123/reference:latestports:…

u盘插在电脑上显示要格式化磁盘怎么办

咨询&#xff1a;“U盘插入电脑&#xff0c;提示需要先格式化 才可使用。对于此种情况&#xff0c;在不需要格式化的情况下&#xff0c;是否可以恢复U盘内容&#xff1f;谢谢” 当我们尝试将U盘插入电脑时&#xff0c;有时会遇到一个令人困惑的提示&#xff1a;电脑要求我们格式…

【总结】在嵌入式设备上可以离线运行的LLM--Llama

文章目录 Llama 简介运用另一种&#xff1a;MLC-LLM 一个令人沮丧的结论在资源受限的嵌入式设备上无法运行LLM&#xff08;大语言模型&#xff09;。 一丝曙光&#xff1a;tinyLlama-1.1b&#xff08;10亿参数&#xff0c;需要至少2.98GB的RAM&#xff09; Llama 简介 LLaMA…

数据处理库Pandas数据结构DataFrame

Dataframe是一种二维数据结构&#xff0c;数据以表格形式&#xff08;与Excel类似&#xff09;存储&#xff0c;有对应的行和列&#xff0c;如图3-3所示。它的每列可以是不同的值类型&#xff08;不像 ndarray 只能有一个 dtype&#xff09;。基本上可以把 DataFrame 看成是共享…

KIMI官方精选提示词,好牛的感觉啊啊啊!

晚上好&#xff0c;我是云桃桃。一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 255篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0…