题目:
求一个有序整数数组中和为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--;
....//保存数对
}
}
}