介绍: two pointers
我这里以数组为介绍又叫双指针,假定有指针名 i,和j。(常见于:数组、链表、字符串)
有助于将很多个for循环降低循环的
1.>--反向(相遇问题):
我们可以有反向的指针i和j【“左右指针”】,方向相反的运动(更新i或者j的值,i从前到尾,j变从我们最大数组的元素个数开始往前和i指针在中间汇合便结束)
【我第一次接触反向扫描的时候,先想到的就是小学时期,时常遇到的题:A地一货车B地有轿车,他们以不同的速度,什么时候会遇见】
我在做双指针(反向)题的时候时常遇到的一般就是判断数组、字符串、数字等是否是回文的。
对比:
//这是O(n^2的时间复杂度
for(int i=0;i<n;i++) //i从头扫到尾
for(int j=n-1;j>0;j--) //j从尾扫到头
......
经历了学习尺取法我们可以看到巨大的变化 :
有两种写法【while循环和for循环】减少空间和时间复杂度。将O(n^2)化为O(n)的。
i = 0; j= n - 1
while (i < j) {
......
i+=1; //i从头扫到尾
j-=1; //j从尾扫到头
}
或者:我前面的文章中就提到过for循环的写法其中是while循环写法的一种缩写变形<