双指针
根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序。
好像常与二分结合使用?
可以用在序列、链表(存储位置)或者树、图上(存储结点)。
或者用于其他算法(eg:单调队列、差分),还有主播没学过的莫队。
正题
顾名思义双指针是两个指针,通常是外层一个内层一个(依靠相对移动去维护区间信息,从而满足题意),写个伪代码:
int j = () ;
for (i : a -> b) {
while (j ...) {
...
}
}
可以看出其实并不是指针,只是用下标实现了类似指针的功能。
根据伪代码不难发现,\(j\) 并不会每次都更新,手模一下发现复杂度 \(\mathcal{O}(n)\),很好。
举个栗子:
给定一个升序排列的数组,请找出两个数是的他们的和满足目标数 \(t\)。
如果二分,显然复杂度 \(\mathcal{O}(n\log n)\),与双指针比较显然更劣,说明这个玩意还是有用的。