快速寻找满足条件的两个数(编程之美)

快速找出一个数组中的两个数,让此两个数之和等于一个给定的数。

如:5 6 1 4 7 9 8 中找出两个数之和等于10的数

编程之美之美P177有详细解答过程,思路是先排序(O(nlog(n)),然后保存两个指针beg、end,初始指向头部和尾部,如过*beg+*end==sum,则返回;如果*beg+*end>sum则向前移动end;*beg+*end<sum,则向后移动beg。

扩展问题:

1、快速找出一个数组中的3个数,让此两个数之和等于一个给定的数。如5 6 1 4 7 9 8 中找出3个数之和等于14的数

思路:

         我们借鉴两个数之和等于指定值的思路。

         首先,排序。数组变成 1 5 6 7 8 9;

         其次,我们用一个指针p从后往前扫描,直到*p*3<sum或者p的前面的元素<3个为止。

         确定p指针后,再p指向前面的数组范围中寻找两个数之和等于sum-*p的两个数。可以用前面的算法。

         如p指向9的时候,我们在p指向前面的数组范围中寻找两个数之和等于5,未找到;p指向8,在8前面的数组范围中寻找两个数之和等于4,为找到;p指向7,在7前面的数组中找两个数之和等于7,我们找到6、1;p指向6,在6前面的数组中找两个数之和等于8,未找到;p指向5,....

先写到这里,下面的问题,下次补充

2、快速找出一个数组中的4个数,让此4个数之和等于一个给定的数。如5 6 1 4 7 9 8 中找出4个数之和等于19的数

3、如何找出一个数组中的4个数,让其中3个数之和等于另一个数。如5 6 1 3 7 9 8 中找出4个数,让其中3个数之和等于另一个数

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值