Day 5 - 双指针与折半搜索
1|0双指针
本页面将简要介绍双指针。
1|1引入
双指针是一种简单而又灵活的技巧和思想,单独使用可以轻松解决一些特定问题,和其他算法结合也能发挥多样的用处。
双指针顾名思义,就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息。
接下来我们来看双指针的几个具体使用方法。
1|2维护区间信息
如果不和其他数据结构结合使用,双指针维护区间信息的最简单模式就是维护具有一定单调性,新增和删去一个元素都很方便处理的信息,就比如正数的和、正整数的积等等。
例题 1
给定一个长度为
过程
设两个指针分别为
实现
使用双指针维护区间信息也可以与其他数据结构比如差分、单调队列、线段树、主席树等等结合使用。另外将双指针技巧融入算法的还有莫队,莫队中将询问离线排序后,一般也都是用两个指针记录当前要处理的区间,随着指针一步步移动逐渐更新区间信息。
例题 2
接下来看一道在树上使用双指针并结合树上差分的例题:
例题
给定一颗
过程
从根开始用 dfs 遍历整棵树,使用一个栈来记录根到当前节点的树链,设一个指针
注意不能直接暴力移动
1|3子序列匹配
例题
给定一个字符串
过程
此类问题需要将字符串
实现
这种两个指针指向不同对象然后逐步进行比对的方法还可以用在一些 dp 中。
1|4利用序列有序性
很多时候在序列上使用双指针之所以能够正确地达到目的,是因为序列的某些性质,最常见的就是利用序列的有序性。
例题
给定一个已按照 升序排列 的整数数组 numbers
,请你从数组中找出两个数满足相加之和等于目标数 target
。
过程
这种问题也是双指针的经典应用了,虽然二分也很方便,但时间复杂度上多一个
接下来介绍双指针做法:既然要找到两个数,且这两个数不能在同一位置,那其位置一定是一左一右。由于两数之和固定,那么两数之中的小数越大,大数越小。考虑到这些性质,那我们不妨从两边接近它们。
首先假定答案就是 1 和 n,如果发现
同理如果发现
推广到一般情形,如果此时我们两个指针分别指在
实现
在归并排序中,在
1|5在单向链表中找环
过程
在单向链表中找环也是有多种办法,不过快慢双指针方法是其中最为简洁的方法之一,接下来介绍这种方法。
首先两个指针都指向链表的头部,令一个指针一次走一步,另一个指针一次走两步,如果它们相遇了,证明有环,否则无环,时间复杂度
如果有环的话,怎么找到环的起点呢?
我们列出式子来观察一下,设相遇时,慢指针一共走了
第一次相遇时
习题
leetcode 1438. 绝对差不超过限制的最长连续子数组
2|0折半搜索
下面将简要介绍两种双向搜索算法:「双向同时搜索」和「
2|1双向同时搜索
定义
双向同时搜索的基本思路是从状态图上的起点和终点同时开始进行广搜或深搜。
如果发现搜索的两端相遇了,那么可以认为是获得了可行解。
过程
双向广搜的步骤:
2|2Meet in the middle
本节要介绍的不是二分搜索(二分搜索的另外一个译名为「折半搜索」)。
引入
它适用于输入数据较小,但还没小到能直接使用暴力搜索的情况。
过程
性质
暴力搜索的复杂度往往是指数级的,而改用
例题
有
解题思路:
如果这道题暴力
参考代码:
2|3外部链接
- What is meet in the middle algorithm w.r.t. competitive programming? - Quora
- Meet in the Middle Algorithm - YouTube
__EOF__

本文链接:https://www.cnblogs.com/So-noSlack/p/18297481.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:So_noSlack,转载请注明原文链接:https://www.cnblogs.com/So-noSlack/p/18297481
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-07-12 第三节 二分