为什么要用到双指针
假设一种情况,现有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 结果如下
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
-2 | -1 | 0 | 2 | 4 | 10 |
i = 0 | j=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
…
重复上述步骤即可得到最终结果