三个数组三数和问题思考(双指针)

题目:之前介绍过在一个数组上的三数和问题,根据排序后的单调性,我们可以利用双指针来寻找到三个数和为k的三元组,对于四元组实际上多一维进行枚举(四数和问题),这里还有个hash表的解法。那么,回归三数和问题,如果三个数分别处在三个数组中呢?所求的三元组要处于三个数组。

思路:我们同样用双指针的思路:

  • 首先我们要对三个数组排序
  • 接着枚举A数组构造 k = a n s w e r − A [ s ] k=answer-A[s] k=answerA[s]
  • 内层循环两个指针分别处于两个数组中,一个在最前方一个在最后方
  • 假设 i i i B [ ] B[] B[]的最后, j j j C [ ] C[] C[]的最前:
  • 如果 B [ i ] + C [ j ] > k B[i]+C[j]>k B[i]+C[j]>k,则 i − − ; i--; i
  • 如果 B [ i ] + C [ j ] &lt; k B[i]+C[j]&lt;k B[i]+C[j]<k,则 j + + ; j++; j++
  • 如果 B [ i ] + C [ j ] = = k B[i]+C[j]==k B[i]+C[j]==k,则 i − − ; j + + ; i--;j++; ij++;

关于这样做的原因我们可以分析一下:假如 B [ i ] + C [ j ] &gt; k B[i]+C[j]&gt;k B[i]+C[j]>k,说明此时必须要让两个元组的减小,能减小的途径就是 i − − i-- i,反之同理。这个题目和在一个从左到右、从上到下分别递增的矩阵中搜索某一个数的思路异曲同工,都是构造能够保证两个决策方向的搜索方式,一个方向递增,另一个方向递减。到此,本题就解决了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值