3sum求和

3sum
问题描述:给定N个整数,求所有3个整数相加等于0的组合。


暴力法: 枚举
C(n ,3 ) = n(n-1)(n-2)/6 = O(n的3次方)


有没有办法改进?
第一个直观思路是排序。
第一步排序: O(n* lg(n))
接下来可以利用2分法查找。A1+A2+A3=0 -> A3 = (A1 + A2) * (-1)
于是循环遍历A1与A2,求A3,查找余下元素中是否有A3,
总的算法效率 O(n的2次方 * lg(n))


还有办法改进吗?
可以用内存换时间,可以将排序改为hash表,于是查找算法变为O(1)。
总算法效率: O(n的2次方)


还有一个巧妙的方法:
确定A3,反过来查找A1,与A2.注意到条件 A1 + A2 = -A3


这样就将问题转化为2sum问题。


问题: 给定N个有序数,求所有2个数相加等于C。
思路:考虑 A(1) + A(n).
如果 A(1) + A(n) > C, 则考虑 A(1) + A(n-1)
如果 A(1) + A(n) < C, 则考虑 A(2) + A(n-1)
如果=c,继续考虑 A(2) + A(n-1).


这样算法效率为O(n)
思路来自: http://rafal.io/posts/k-numbers-sum-to-c.html


进一步分析,发现这是一个经典的子集划分问题,HP完全问题。

给定集合A,大小n,求所有子集,其元素之和为0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值