快速找出一个数组中的两个数,让此两个数之和等于一个给定的数。
如: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个数之和等于另一个数