双指针
【双指针】
双指针(two-pointer method)
这里的指针不是指向内存地址的指针,而是一个类似于光标的、指向一个位置的指针。
双指针是一个优化时间复杂度的思想。
【例子1】
二重循环当然可以,但是太慢了。
于是我们可以使用双指针优化。
样例:
7 7
1 3 4 8 6 9 5
我们先对这个数组排序。
1 3 4 5 6 8 9
定义两个指针
枚举
随之调整
当
我们发现,在开始调整了
这个过程是
【特点】
-
属性关于位置单调变化;
-
对枚举问题,利用单调性以优化枚举;
-
通常枚举一个指针,另一个指针单向维护。
【题目】
先排序。
还是两个指针指向
还要
把瓜数组和刀数组排序。
两个指针
每次刀数组的指针加一,另一个指针一直增加到最大的宰牛的瓜。
注意:移动指针时,要判断还有没有下一个。
这题为什么是双指针呢?
两个指针
一个区间不能变成纯白,等价于这个区间内的黑格子大于
在这个过程中,
单调性:段越长,种类越多。
做一个
双指针,不一定只是“双”指针。
定义三个指针,
不妨
我们发现,当我们枚举
左边一段,
右边一段,
而
最后我们只需要把
(信息课考试最后一题)
H牛:好牛,G牛:坏牛
第一想法:
枚举上下左右边界,边界上一定有好牛。(不然可以面积更小)
优化:
按 x 排序,选择两只牛做左右边界(
把牛复制一遍,按 y 排序(给双指针用)。
每次找好左右边界之后,从上到下找牛(所有牛)。
定义
如果当前牛不在左右边界内,不管;
如果当前牛在边界内,并且是好牛,把
如果当前牛在边界内,并且是坏牛,则不能扩张了,
但是,如果我们可能会让上下边界没包括左右边界上的牛,对不对?
没问题,因为我们枚举所有牛的时候也包含了左右边界的牛。
但是,我们枚举的
没问题,因为我们总有一次会枚举到以
不存在,但是不会更新答案的方案,我们不在乎。
【总结】
只要有有序性,就可以考虑双指针。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!