双指针算法学习总结

一,双指针是一种很好用的算法,它常常被我们拿来优化程序,降低时间复杂度

这里来点简单的应用

例子 合并两个有序的数组 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)是一种很好用的算法,感觉也可以说是一种小技巧吧,它在优化代码上可以给我们提供很大的帮助

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值