程序员面试金典-整数对查找
链接: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; } };