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

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

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

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

扩展问题:

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

思路:

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

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

         其次,我们用一个指针p从后往前扫描,直到*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个数之和等于另一个数

你可能感兴趣的:(算法相关,编程之美)