程序员面试金典-整数对查找
链接:https://www.nowcoder.com/questionTerminal/87d5a092a1d647479103e519a6c0a205
来源:牛客网
请设计一个高效算法,找出数组中两数之和为指定值的所有整数对。
给定一个int数组A和数组大小n以及需查找的和sum,请返回和为sum的整数对的个数。保证数组大小小于等于3000。
测试样例:
[1,2,3,4,5],5,6
返回:2
本题的关键在于 数组中含有相同的元素,所以需要考虑重复元素带来的计数问题。
在 while 中, l 和 r 的有效区域很广,所以在 if 后面需要加上 continue!!!!
class FindPair {
public:
int countPairs(vector<int> A, int n, int sum) {
// write code here
if(n == 0){
return 0;
}
sort(A.begin(), A.end());
int l = 0, r = n-1, cnt=0;
while(l < r){
if(A[l] + A[r] < sum){
++l;
continue;
}else if(A[l] + A[r] > sum){
--r;
continue;
}else{
if(A[l] == A[r]){
int tmp = 1;
while(A[l] == A[l+1]){
++l;
++tmp;
}
++l;
cnt += (tmp - 1)*tmp/2;
break;
}
int cntleft = 1, cntright = 1;
while(l < n && A[l+1] == A[l]){
++cntleft;
++l;
}
while(r>=0 && A[r-1] == A[r]){
++cntright;
--r;
}
cnt += cntleft * cntright;
++l;
--r;
}
}
return cnt;
}
};