題目描述
請設計一個高效算法,找出數組中兩數之和爲指定值的所有整數對。
給定一個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;
}
};