滑动窗口不是双指针魔法:把“从两头拿数”改写成最长子数组
滑动窗口不是双指针魔法把“从两头拿数”改写成最长子数组滑动窗口常被一句“双指针就能做”带过真正决定正确性的却是窗口不变量。本文从“每次只能从数组两端拿走 x”这个看似需要搜索的题目出发反过来寻找中间留下的最长连续子数组并用窗口维护它。通过一个完整的 Python 实现拆开窗口何时扩张、何时收缩以及为什么负数会破坏这套方法。把两端操作翻译成中间问题给定数组nums和整数x一次操作可以从最左或最右拿走一个数问最少几次让拿走的总和恰好为x。正面思考会产生很多左右选择每一步都有两个分支深度一大就很难控制。换一个角度如果数组总和是S拿走的部分和为x留下的连续中间段和就必须是S - x。拿走越少留下的中间段越长。因此问题等价于找到和为S-x的最长连续子数组答案是n - 最长长度。这个等价变换比“记住滑动窗口模板”重要。窗口的目标不是直接找最少操作而是最大化留下来的长度。把等价关系写成式子可以防止方向弄反。设左侧拿走l个、右侧拿走r个那么操作次数是lr留下区间的长度是n-l-r。三部分覆盖整个数组所以“左侧和 中间和 右侧和 S”。已知两端拿走的和为x中间和必然为S-x。最小化lr正好等价于最大化n-l-r。这里没有使用贪心假设只是把同一个方案从另一面描述因此转换不会漏解。第一条线索由此出现题目表面在选择两端真正变化的却是中间保留区间的左右边界。所有合法的“两端拿取”都对应唯一的连续中间段反过来任意连续中间段也唯一决定左右各拿多少。建立这个一一对应后指数级的左右选择树就消失了问题变成标准的连续子数组搜索。第二条线索是输入约束。只有数组元素非负时窗口和才随右端扩张而不下降超出目标后移动左端也不会让和变大。如果题目没有给出这个条件看到“连续区间”就套滑动窗口仍然可能错。算法选择应来自单调性而不是来自题目里出现了“数组”两个字。窗口不变量是什么对于全为非负数的数组右端点向右移动时窗口和只会增加当和超过目标就不断移动左端点直到和重新不超过目标。整个过程只需要两次单调移动每个元素最多进窗口一次、出窗口一次。关键不变量是进入下一轮判断时窗口[left, right]的和不超过目标target。当它恰好等于目标就用当前长度更新最优值。若目标为负或者数组包含负数窗口和不再单调这个办法就不能直接套用应改用前缀和加哈希表。以[1,1,4,2,3]、目标 6 为例逐步记录窗口读入位置读入值收缩后窗口窗口和当前最长01[1]1未找到11[1,1]2未找到24[1,1,4]6332[4,2]6343[3]33读到 2 时窗口和先从 6 变成 8于是左端依次移走两个 1最终留下[4,2]。这个窗口也是合法解但长度只有 2不会替换长度 3 的记录。注意算法并不在第一次找到目标时返回因为后面可能出现更长的区间我们求的是最长保留段而不是任意保留段。为什么左右指针不会回头当窗口和超过目标时在当前右端点固定的情况下任何更靠左的起点只会让和更大或相等不可能成为目标解因此可以永久丢弃。右端点继续前进后被丢弃的起点也没有恢复价值。这就是线性时间的核心证明两个指针都只向右走每个元素最多被加一次、减一次。运行示例数组[1, 1, 4, 2, 3]的总和是 11x5目标留下的和是 6。最长满足条件的连续段是[1, 1, 4]长度 3因此最少拿走5 - 3 2个数也就是从右边拿走 3 和 2。fromtypingimportListdefmin_operations(nums:List[int],x:int)-int:totalsum(nums)targettotal-x nlen(nums)iftarget0:return-1left0window_sum0best-1forright,valueinenumerate(nums):window_sumvaluewhileleftrightandwindow_sumtarget:window_sum-nums[left]left1ifwindow_sumtarget:bestmax(best,right-left1)return-1ifbest-1elsen-bestdeflongest_at_most_k_zeros(nums:List[int],k:int)-int:同一个窗口骨架求最多翻转 k 个 0 时的最长连续 1。leftzerosbest0forright,valueinenumerate(nums):zerosvalue0whilezerosk:zeros-nums[left]0left1bestmax(best,right-left1)returnbestif__name____main__:assertmin_operations([1,1,4,2,3],5)2assertmin_operations([5,6,7,8,9],4)-1assertmin_operations([3,2,20,1,1,3],10)5assertmin_operations([1,0,1],2)2assertlongest_at_most_k_zeros([1,1,1,0,0,0,1,1,1,1,0],2)6print(sliding-window checks passed)测试里的四个min_operations用例分别覆盖存在常规解、总和不足导致无解、最优方案需要一侧拿多个元素以及目标为零但中间能保留 0。最后一个函数不是题目必需部分它用“最多包含 k 个零”的条件展示同一骨架右端加入元素约束被破坏时推进左端约束满足时更新最长长度。骨架相似不变量却不同这正是不能机械背模板的原因。如果数组包含负数应切换到前缀和。令prefix[j]表示前j个元素之和需要寻找最远的一对下标使prefix[j]-prefix[i]target。从左到右扫描时用哈希表记录每个前缀和值第一次出现的位置对当前前缀p若表中存在p-target两下标之差就是一个候选长度。之所以保留第一次出现的位置是因为同一前缀和越早出现得到的区间越长。这个方案时间 O(n)、空间 O(n)不依赖窗口和单调。三个容易写错的地方一是目标为零时直接返回n。如果数组允许出现 0中间仍可能留下连续的零元素。例如[1,0,1]、x2只需拿走两端的 1。让通用窗口逻辑继续运行它既能记录长度为 0 的空窗口也能找到更长的全零窗口。二是不存在解。best-1比用 0 更清楚因为长度为 0 可能是合法的中间段只有找到目标和时才更新。三是把非负数组假设藏起来。若数组允许负数右边加入一个负数可能让窗口和下降左边收缩也不再具有单调性。此时应记录前缀和prefix[i]用哈希表寻找prefix[j] - prefix[i] target的最长距离。四是使用 32 位整数累加。元素数量和单个值都较大时总和可能溢出。Python 整数会自动扩展Java 应用longC 应用long long。一旦总和溢出targetS-x和窗口比较都会失真错误通常只在大数据测试里出现。五是把“超过目标才收缩”写成“达到目标就收缩”。相等时应该先记录当前长度再让外层循环扩张右端过早收缩会丢掉后续的零元素无法得到最长的零扩展区间。允许 0 的数组尤其容易暴露这个问题。复杂度两段指针都只向右移动所以时间复杂度是 O(n)额外空间 O(1)。当数组很大时真正需要关注的是整数溢出C/Java 应使用 64 位整数保存总和而不是盲目使用 32 位int。空间 O(1) 指的是除输入外只维护若干整数并不把结果数组算进来。若换成允许负数的前缀和方案时间仍为 O(n)额外空间会变成 O(n)。这两者不是谁绝对更好而是分别对应不同的数据约束。先读清元素是否为正数或非负数再选择实现往往比优化某一行代码更重要。提交前可以再用一张边界清单审问实现。空数组与x0如何定义要服从题目契约x大于总和应立即无解单元素数组要分别测试拿走与不拿走全零数组要确认最长零窗口不会被过早收缩答案可能同时来自左侧、右侧或两侧不能只覆盖一种形态。对于随机小数组还可以枚举左边拿l个、右边拿r个的所有组合与窗口结果对拍。暴力算法虽慢却很适合在开发阶段充当正确性裁判。这套推理也提示了一个边界若每次操作允许从两端拿走任意长度的一段操作次数的定义已经改变最长保留区间不再直接等价于拿走元素个数。等价转换必须逐项对应目标函数不能因为故事背景相似就沿用结论。先写出方案之间的一一映射再决定是否使用滑动窗口是比记忆题号更稳的做法。小结滑动窗口不是“两个指针一起走”的魔法而是由单调性支撑的不变量。先把题目翻译成“保留最长合法区间”再判断数据是否满足非负条件模板才会变成可靠的工具。

相关新闻

GPT2-Chinese终极指南:从零开始构建中文文本生成模型的完整实践

GPT2-Chinese终极指南:从零开始构建中文文本生成模型的完整实践

GPT2-Chinese终极指南:从零开始构建中文文本生成模型的完整实践 【免费下载链接】GPT2-Chinese Chinese version of GPT2 training code, using BERT tokenizer. 项目地址: https://gitcode.com/gh_mirrors/gp/GPT2-Chinese GPT2-Chinese是中文GPT2训练代码的…

2026/10/2 8:59:08 阅读更多 →
【佩奇课堂】我搭建了一个面向开发者的主动学习平台,视频+文档+练习+社区一站搞定

【佩奇课堂】我搭建了一个面向开发者的主动学习平台,视频+文档+练习+社区一站搞定

前言大家好,我是佩奇。做开发这些年,我越来越觉得:自学最难的不是找资料,而是把「学、练、问、记」串成闭环。视频在 B 站,文档在语雀,练习在别的网站,问题在群里—— 资料都不缺,但…

2026/10/10 16:11:35 阅读更多 →
如何区分吸水粉厂家与中间商

如何区分吸水粉厂家与中间商

大量水产、制袋采购分不清冰袋吸水粉源头厂家和贸易中间商,高价购入分装杂牌原料,性能波动、旺季断货、售后无人处理,全年隐性损耗巨大,掌握四个核心区分点,采购快速甄别货源类型。第一区分生产定制能力:源…

2026/9/26 2:39:07 阅读更多 →

最新新闻

HarmonyOS 7的API 26 破坏性变更与迁移

HarmonyOS 7的API 26 破坏性变更与迁移

我们维护的 3DGS 商品展示应用跑在 API 25 上半年了,存量代码 8000 多行。HarmonyOS 7(API 26)发布后,IDE 提示 Spatial Recon Kit 有更新,我们顺手把 compileSdkVersion 改成 26,结果编译报 47 个错。不是…

2026/10/15 3:01:35 阅读更多 →
图像分割三大经典算法原理与选型指南:K-Means、最小割与归一化图割

图像分割三大经典算法原理与选型指南:K-Means、最小割与归一化图割

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 3:01:35 阅读更多 →
cas:2777084-88-3,Sulfo-NHS-LC-Desthiobiotin,磺基-N-羟基琥珀酰亚胺-长链-脱硫生物素,SULFO-NHS-LC-脱硫生物素

cas:2777084-88-3,Sulfo-NHS-LC-Desthiobiotin,磺基-N-羟基琥珀酰亚胺-长链-脱硫生物素,SULFO-NHS-LC-脱硫生物素

基础理化信息参数项具体内容中文全称磺基-N-羟基琥珀酰亚胺-长链-脱硫生物素CAS号2777084-88-3分子式C₂₀H₃₁N₄NaO₉S分子量526.54外观形态白色或类白色固体粉末产品纯度≥95%常见规格10mg、25mg、50mg、100mg结构式:分子结构与核心特性磺基(Sulfo&a…

2026/10/15 3:01:35 阅读更多 →
Revit卸载工具深度解析:残留清理与重装失败解决方案

Revit卸载工具深度解析:残留清理与重装失败解决方案

简介:Revit卸载工具是一款面向BIM从业者、软件部署维护人员的专用清理程序,专门处理Autodesk Revit及Visual Studio 2015等软件卸载后遗留的注册表项、配置文件和用户数据,解决因卸载不彻底导致的新版本安装失败或系统迟滞问题。资源为RAR压缩…

2026/10/15 3:01:35 阅读更多 →
报名开启|CANN Meetup 智能交通技术沙龙,共探AI+公路产业新路径

报名开启|CANN Meetup 智能交通技术沙龙,共探AI+公路产业新路径

随着大模型、AI感知技术加速落地,智慧公路、车路协同、交通巡检等场景迎来爆发期。但行业依然面临算子适配难、模型迁移成本高、软硬协同落地复杂等现实问题。 为打通产学研交流链路,搭建CANN开源社区在交通行业的开发者交流阵地,CANN Meetu…

2026/10/15 3:01:35 阅读更多 →
仓颉 std.database.sql 事务接口 Transaction 完全指南:核心行为、隔离级别与保存点实战

仓颉 std.database.sql 事务接口 Transaction 完全指南:核心行为、隔离级别与保存点实战

人工智能AI 技能文档开发工具 【免费下载链接】DocAgent 项目地址: https://gitcode.com/Cangjie-SIG/DocAgent 点击查看 免费下载 Transaction 是仓颉标准库 std.database.sql 中定义数据库事务核心行为的接口,它规定了事务从开始、提交、回滚到保存点…

2026/10/15 3:00:34 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →