两数之差
当不能使用哈希表时
1.可以在排序数据集上进行二分来替代
2.不能使用哈希表的情况比如数据集很大或者题目要求不适用额外空间
使用二分法代替哈希表
时间复杂度O(nlogn),n个数,每个数二分都需要logn的时间,所以是nlogn
同相双指针
- 时间复杂度O(n)
- 两根指针同向而行,都不会“回头”
如果外层循环i从0到n-1;内层循环j从0到n-1,就会出现回头,但我们设置j是没有设置初值的,所以不会回头。 - i和j一直++;时间复杂度取决于内层循环,内层循环不可能超过n(j<n),所以时间复杂度是O(n)
- 每个指针访问数组中每个元素最多一次
j=1;
for i from 0 to n-1
(为避免i移动到j上或j的右面,需要特殊处理j=max(j,i+1))
while j<n(or i) and i,j的搭配不满足条件
j+=1
if j>=n
break
处理i,j这次搭配
全零子串问题
用同向双指针,求出以i开始的全零子串的长度(j-i),j是第一个非0元素的位置
数组去重
不用额外空间,考虑双指针
1.首先数组排序(可以用于后面判断是否重复),时间复杂度O(nlogn),是快排,不占用额外空间
2.从头到尾扫一遍,把不相同的数向前挪,相同的数跳过,时间复杂度O(n)
滑动窗口求和
套用同向双指针模板,唯一不同是j=0作为初始
j-i=k为止结束
j指向窗口i-k+1
带环链表问题和链表相交问题
1.带环链表
快慢指针
2.链表相交点
先转换成带环链表,再求入口
K次替换后的最长重复字符
出现子字符串且i和j不回头的问题:可以想到同向双指针
1.j指向满足条件的子字符串的后面一个位置
2.如果j-i-maxFreq>k
i~j-1的substring 需要k+1
i~j-2的substring只需要k次替换
3.否则,i~j-1的substring<=k替换
需要j-i(j-1-i+1)
数组和字符串上的同向双指针总结
1.数组和字符串的问题有很多题都是和双指针,特别是同向双指针有关
2.通常问题让我们求是一段子树或者子字符串
3.所以遇到“子数组SubArray”和“子字符串Substring”就需要往同向双指针思考