求一个有序整数数组中和为K的数的对数

来源:互联网 发布:2016淘宝小卖家好做吗 编辑:程序博客网 时间:2024/06/06 09:48

题目:

求一个有序整数数组中和为K的数的对数。

解决方案:

两个指针,一个在头,一个在尾;

大则-,小则加。

 

延伸题目:

(1)求整数数组中和为K的对数。

先排序,O(N*logN),在按照以上算法查找O(N)。

(2)求一个整数数组差为K的数的对数。

先排序,O(N*logN),然后,用两个指针均从头部开始,一个先走一个后走,差过小则前指针++,差过大则后指针++。

这里需要考虑一个问题,如果数组中有重复元素的话,需要做处理。

处理方法可以如下:

while(*pBack = *(pBack+1))

{

...

pBack++;

}

while(*pFront = *(pFront+1))

{

...

pFront++;

}

这样,先找出低位重复的,再找出高位重复的即可。

 

原题目中,如果存在重复,应该怎么解决呢?

while(p1<=p2)

{

if(*p1+*p2 < K) p1++;

else if(*p1+*p2 > K) p2--;

else

{

...//保存数对

while(*p1 = *(p1+1))

{

p1++;

...//保存数对

}

while(*p2 = *(p2-1))

{

p2--;

....//保存数对

}

}

}