【双指针】两只指针爱跳舞~

为什么要用到双指针

假设一种情况,现有n个数,你需要从中找到两个数 a和b,使得 a+b=0
easy! 直接暴力排列组合不就解决了?但是这样往往会导致计算时间爆炸 (TT)
如何简化运算量呢?
这时候就需要请双指针来跳舞了跳舞(((((ી(・◡・)ʃ)))))

什么是双指针

但我们去遍历一个数组时,一般使用的都是单个指针 i,双指针,顾名思义就是额外增加了一个指针 j,同时使用两个指针去遍历一个数组,如果两个指针的遍历方向相同就叫快慢指针,如果两个指针的遍历方向相反就叫对撞指针。
俗话说,“男女搭配,干活不累”,那么双指针间又是如何搭配使用,来提高运算效率呢?(`ヘ´)=3

双指针怎么用

  • 对撞指针

最左侧索引定义为左指针 i = 0
最右侧索引定义为右指针 j =最后一个元素

对撞指针往往适用于有序数组
对撞即为左右指针的运动方向相反,由两侧向中间逼近
———————————————————————————————————————————————
我们用最开始的问题举例
假设我们现在有 a[6]={10,2,4,-1,-2,0}
我们需要从 a[6] 中寻找两个数使其和为0
首先我们先对数组进行排序,并设置左指针 i=0, 右指针 j=5 结果如下

012345
-2-102410
i = 0j=5
指针移动规则如下

i 往右移动,j 往做移动
i < j
a[i] + a[j] == 0 则 i++, j++ , 并保存结果
a[i] + a[j] < 0 则 i++(说明相加结果偏小,所以需要将 i 增大,增大相加结果)
a[i] + a[j] > 0 则 j++(说明相加结果偏大,所以需要将 j 增大,减小相加结果)
最终当i = j 时停止

a[0] + a[5] = 8 > 0 因此 j=j-1=4
a[0] + a[4] = 2 > 0 因此 j=j-1=3
a[0] + a[2] = 0 因此 j=j-1=2, i = i + 1 = 1 并保存结果 a[0] + a[2] = 0

重复上述步骤即可得到最终结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值