题目描述
请设计一个高效算法,找出数组中两数之和为指定值的所有整数对。
给定一个int数组A和数组大小n以及需查找的和sum,请返回和为sum的整数对的个数。保证数组大小小于等于3000。
测试样例:
[1,2,3,4,5],5,6
返回:2
//用红黑树最大的陷阱就是可能sum可以分为两个相同的数之和
class FindPair {
public:
int countPairs(vector<int> A, int n, int sum) {
// write code here
map<int,int>mp;
for(int i=0;i<n;++i)
++mp[A[i]];
int res=0;
map<int,int>::iterator left=mp.begin();
map<int,int>::iterator right=mp.end();
--right;
while(left!=right){
if(left->first+right->first==sum){
res+=(left->second*right->second);
++left;
if(left!=right)
--right;
else
break;
}
else if(left->first+right->first<sum){
++left;
}
else
--right;
}
int mid=(sum%2?0:sum/2);
if(mid!=0){
res+=mp[mid]*(mp[mid]-1)/2;//也就是说sum可以分为两个相同的数之和,组合个数为Cn2
}
return res;
}
};