一,双指针是一种很好用的算法,它常常被我们拿来优化程序,降低时间复杂度
这里来点简单的应用
例子 合并两个有序的数组 A={1,3,7,8}和B={2,4,9,10}
这时候我们定义两个变量 a=0,b=0,分别指向这两个数组的第一个位置
然后比较A[a]和B[b]的大小,如果A[a]<B[b],那么A[a]进入新数组C里面,
然后a++,循环反复,如果当其中一个指针超出了数组的范围,那么直接把另一个数组接到C数组上
就可以的到一个有序数组;
具体代码实现如下
#include <stdio.h>
int main(){
int A[4]={1,3,7,8},B[4]={2,4,9,10},a=0,b=0;
int C[8]={0},p=0;
while(a<4&&b<4)//两个指针都在数组有效范围里才比较
{
if(A[a]>B[b]) C[p++]=B[b++];
else C[p++]=A[a++];
}
while(a<4) //剩下两个while都一样,检验看哪一个数组还有剩余,接到c数组上
C[p++]=A[a++];
while(b<4)
C[p++]=B[b++];
for(int i=0;i<8;i++)
printf("%d ",C[i]);
}
用双指针来实现这个合并数组的时间复杂度仅有O(n+m)(两个数组长度和)
上面的代码其实还有可以优化的地方,如果一开始A数组大小就是(n+m),那么我们就可以不用开一个新的数组合并
这个时候的思路就跟刚开始不同了,我们把a,b指向A,B的尾部也就是a=3,b=3,从后面开始比较大小
把大的数放在A数组的最后面,循环反复,就可以在空间复杂度上实现优化
总结
双指针(two pointers)是一种很好用的算法,感觉也可以说是一种小技巧吧,它在优化代码上可以给我们提供很大的帮助