当前位置: 首页 > news >正文

滑动窗口问题记录

对于字符串或者数组,找到一个连续的区间,这个区间满足一定的条件。这样的问题就使用滑动窗口来解决,滑动窗口,从某种意义上属于动态规划算法,也使用了双指针。

使用滑动窗口算法有一个基础的前提,即数据结构是线性的数据结构。tcp协议栈中发送窗口是滑动窗口,也是因为tcp是面向连接的字节流协议,有序列号,是线性,才会有滑动窗口。

滑动窗口的关键是确定窗口的两个边沿什么时候移动,什么条件下移动,在移动的时候做什么。一般情况下,窗口右边沿是一直向前移动,在移动的过程中根据判断条件来决定左边沿是不是需要移动。每一次循环都要判断右边沿需要做什么,左边沿需要做什么。

1最小覆盖字符串

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

class Solution { public: string minWindow(string s, string t) { //找一个范围,字符串或者数组,这样的问题,使用滑动窗口 //滑动窗口,关键是窗口的两个边沿什么时候移动 //一般情况下是,一个边沿直接移动 //另外一个在特定条件下移动 //1、首先计算t字符串每个字符出现的次数 //2、然后遍历s字符串,看计数,然后增加count,移动右边沿 //3、什么时候移动左边沿呢,count和t的长度相同的时候,这个字符串就是一个预期的结果 for (char oneC : t) { tCharCount[oneC]++; } int left = 0; int right = 0; for (right = 0; right < s.size(); right++) { sCharCount[s[right]]++; //为什么是<=,而不是<,因为sCharCount[s[right]]在上边已经++了 //循环算法,递归算法,这些都是最基础的算法,关键是在这些算法行进的过程中要做什么事情 if (sCharCount[s[right]] <= tCharCount[s[right]]) { count++; } while (sCharCount[s[left]] > tCharCount[s[left]]) { sCharCount[s[left]]--; left++; } if (count == t.size()) { if (ret.empty() || right - left + 1 < ret.size()) { ret = s.substr(left, right - left + 1); } } } return ret; } int tCharCount[123] = {0}; int sCharCount[123] = {0}; int count = 0; std::string ret = ""; };

2无重复字符的最长子串

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

class Solution { public: int lengthOfLongestSubstring(string s) { //最基本的方法 //长度从大到小遍历字符串,看是不是有重复,有重复继续进行 //没有重复直接返回 //滑动窗口 //右边沿直接滑动 //用map保存字符所在的索引,如果已经存在了,说明重复了,移动left int ret = 0; int size = s.size(); int left = 0; int right = 0; std::map<char, int> charIndex; for (; right < size; right++) { if (charIndex.find(s[right]) != charIndex.end()) { //这个判断条件很容易忘 if (left < charIndex[s[right]] + 1) { left = charIndex[s[right]] + 1; } } //这行很容易忘 charIndex[s[right]] = right; ret = (right - left + 1) > ret ? (right - left + 1) : ret; } return ret; } };

3长度最小的子数组

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

class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { //右边沿一直向前走 //用一个sum记录和 //当和大于等于target,移动left //ret初始值初始化为0 int len = nums.size(); int left = 0; int right = 0; int sum = 0; int ret = 1000000; for (; right < len; right++) { sum += nums[right]; // >= 而不是 >,因为结果都是在这里计算的 while (sum >= target) { ret = right - left + 1 < ret ? right - left + 1 : ret; sum -= nums[left]; left++; } } return ret == 1000000 ? 0 : ret; } };
http://www.jsqmd.com/news/1181918/

相关文章:

  • Unity集成3D Gaussian Splatting实战:从原理到多平台部署的完整指南
  • Visual Studio 2015 与 2026 版本对比:5个关键差异与旧项目兼容性实测
  • 《Python程序设计与数据分析》全套PPT课件
  • DataBuff 发布 v0.1.3 版本:支持 SkyWalking 接入,新增运维专家排障等功能
  • 洛雪音乐音源终极指南:免费获取无损音乐的完整教程
  • 杭州本地黄金回收性价比榜单:大额金条变现首选、小额旧金首饰门店分开推荐 - 奢侈品回收评测
  • 视频创作者必备!pexo-skills Studio系列工具深度教程:图片、音频、视频一站式生成
  • 2026沈阳首饰回收攻略|闲置首饰别乱卖!内行变现高价秘诀 - 奢侈品回收中心
  • LemoScience实现科研知识自动沉淀
  • 2026 年北京叉车租赁吊车租赁仓储装卸本地博主实测推荐 - LYL仔仔
  • 从零开始打造个性化游戏体验:Wand-Enhancer深度解析与实战指南
  • 破解DeepSeek的上下文窗口
  • Phi-4-reasoning-plus-w4a16-tao-symchannel-torchao-v0.17.0实战案例:构建企业级AI推理服务的完整教程
  • 7大核心插件!BepisPlugins彻底改变你的Illusion游戏体验 [特殊字符]
  • Unity游戏纹理翻译实战指南:从资源重定向到全界面汉化
  • 2026南京黄金首饰回收机构测评:五大奢侈品回收品牌实力分级对比 - 每日生活报
  • 2026年沧州代理记账怎么选不踩雷?5家实测对比与避坑推荐 - 中国华商产业观察网
  • Nemotron-3多语言支持详解:如何在12种语言中实现精准内容安全检测
  • mihome-binary-protocol协议实战:使用pcap-decrypt.py工具解密小米设备通信的完整指南
  • 如何利用sherpa-onnx流式Zipformer模型构建高性能英语语音识别系统
  • Agent智能工具选择:核心逻辑与工程实践
  • TMR-SOMA-RP-v1核心原理深度解析:双编码器Transformer架构揭秘
  • Zapier AI + Notion + Slack自动化闭环搭建,手把手带练(附实时调试日志+错误码速查表)
  • NPU部署新纪元:Phi-4-mini-reasoning_rai_1.7.1_npu_4K如何实现4096序列长度优化?
  • DeepSeek-R1-Distill-Llama-8B_rai_1.7.1_npu_16K vs 同类模型:16K上下文长度如何提升长文本处理能力?
  • XMeshGraphNet DrivAerML核心技术解析:多尺度图神经网络在CFD中的应用
  • ERB Lint 插件生态系统:如何扩展和定制检查功能
  • Qwen2.5-VL-7B-Instruct-da8w8-torchao-v0.16.0震撼发布:AMD ZenDNN优化的CPU视觉语言模型终极指南
  • 2026 厦门梵克雅宝首饰变现,易奢福上门专业鉴定估价 - 奢侈品回收实体店
  • 3分钟学会配置洛雪音乐:免费获取全网高品质音乐的完整指南