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

LeetCode 高频题:双指针不是模板,是单调关系

LeetCode 高频题:双指针不是模板,是单调关系

一、别把双指针背成口诀

双指针是高频技巧,但很多人只会背“左右指针往中间走”“快慢指针找环”。背模板能做几道题,遇到变形就懵。双指针真正成立的前提,是问题里存在某种单调关系:移动某个指针后,答案空间能被安全排除一部分。

比如有序数组两数之和,左小右大,和太小就左移,和太大就右移。这不是玄学,是单调性保证了被排除的组合不可能成为答案。理解这个,模板才不会乱用。

二、推导链路:先找单调性

flowchart TD A[题目约束] --> B[是否有序或可排序] B --> C[移动指针会排除哪些答案] C --> D[证明排除安全] D --> E[写代码]

不要一看到数组就双指针。先问:指针移动后,为什么不会漏答案?如果回答不上来,说明还没理解。

三、代码示例:有序数组两数之和

def two_sum_sorted(nums, target): l, r = 0, len(nums) - 1 while l < r: s = nums[l] + nums[r] if s == target: return [l, r] if s < target: l += 1 else: r -= 1 return [-1, -1]

复杂度是 O(n),空间 O(1)。关键不在代码短,而在证明:当 s < target 时,固定 l 搭配更小的右端只会更小,所以 l 可以安全右移。这个证明比代码更重要。

四、工程边界:排序会改变原始索引

很多双指针题需要排序,但排序会改变原数组索引。如果题目要求返回原始下标,就要保存值和索引。刷题时很容易在这里翻车。工程里也一样,优化前要确认输出语义有没有被破坏。

取舍方面,排序后双指针通常是 O(n log n),哈希表可能是 O(n),但双指针空间更省,也更容易处理去重和区间问题。不要迷信某一种方法,要看题目要求。

双指针还常用于滑动窗口。滑动窗口和左右夹逼不一样,它维护的是一个区间,并通过条件收缩左边界。它也依赖单调性:右指针扩展后,某些条件只会变强或变弱。理解这一点,才能写对窗口收缩。

再举一个反例:如果数组里有负数,很多“和不超过 k”的滑动窗口就不成立,因为右指针扩展后窗口和可能变小,左指针收缩后也可能变大,单调性被破坏。这个时候还硬套模板,就会漏答案。算法学习最怕只记成功案例,不记失败条件。

写题解时建议加一段“为什么不能用别的方法”。比如这题能不能哈希,能不能二分,为什么双指针更合适。比较方法能帮助读者建立选择能力,而不是只学一份代码。

最后,双指针代码要特别注意循环条件。l < rl <= r、移动后是否跳过重复值,都会影响边界。很多题不是思路错,而是边界错。边界检查应该进入题解,而不是留给读者自己撞墙。

去重问题也很典型。三数之和里,排序后固定一个数,再用双指针找另外两个数。找到答案后,需要跳过相同的左值和右值,否则结果重复;固定点也要跳过重复。这里的去重不是代码装饰,而是输出语义要求。

还有一类题需要“同向双指针”,比如删除有序数组重复项。慢指针维护已处理区域,快指针扫描新元素。它和左右夹逼完全不同。题解里把类型分清,读者才不会把所有双指针混成一锅粥。

分类清楚,模板才有用。

否则模板会反噬你自己本身。

五、总结

双指针不是模板,而是建立在单调关系上的搜索空间剪枝。写代码前先证明移动指针不会漏答案,才能在高频题里稳住。

http://www.jsqmd.com/news/1112510/

相关文章:

  • Go Wind UBA 拆解系列 - 多租户与安全:两套隔离机制的边界
  • Skywalking分布式监控部署与SpringBoot集成实战
  • 【计算机Java毕业设计案例】基于 SpringBoot 的水务应急预案管理与智能调度系统的设计与实现 基于 SpringBoot 的水务运行大数据分析与应急决策系统(程序+文档+讲解+定制)
  • 【每天认识一个国家 | 法国】
  • 医养智伴APP的设计与开发
  • 情绪类 AI 的安全分级:先识别风险,再决定回应方式
  • Device Tree 调试:外设不工作,先别急着改驱动
  • AI 后端队列背压:请求堆住时,系统要会说不
  • Java计算机毕设之基于学习行为分析的自适应课程推荐系统的设计与实现 基于 SpringBoot 的在线教学资源个性化推荐系统(完整前后端代码+说明文档+LW,调试定制等)
  • 从零到一开发「天才厨神」美食烹饪小程序:架构设计与踩坑记录
  • AI 视觉回归评审:截图对比之外还要读懂界面意图
  • 微信小程序开发一个多少钱?附教程+5款国内外小程序开发工具实测(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 3步实现专业级视频水印去除:智能算法让画面瞬间纯净如初
  • AI绘画LoRA微调实战:从原理到应用
  • 西门子PLC电机控制:SCL结构化编程实战
  • LLM 推理延迟监控体系:从 Metrics 采集到 SLO 驱动的告警策略
  • 边缘模型 OTA:更新模型前,先准备好回滚
  • 智能服务网格灰度:策略建议可以 AI 化,执行必须可回滚
  • 资讯复盘:7月首个交易日A股科技股集体跳水
  • AI 工作流运营指标:别只看自动化率
  • AI 性能压测分析:让模型读报告,不要让它替你下结论
  • 兵棋推演系统:兵棋推演模拟软件
  • 算法之链表2
  • 工程方法领域:
  • 【CANdelaStudio-从入门到深入到实战】96 诊断刷写黑盒测试:如何用Python自动验证CANdela服务行为
  • H5 到底能不能做视频直播?
  • 独立产品数据模型:小型 SaaS 也需要清楚的边界
  • 2026 Agent 模型选型实战:Sonnet 5 vs Opus 4.8 + 28 模型横评数据全解
  • Flutter 状态动画:让变化顺滑,但不要重建整棵树
  • 哈希表题解:O(1) 查询背后也有边界