程序员面试金典-整数对查找

程序员面试金典-整数对查找

链接: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; 
    }
};

  

原文地址:https://www.cnblogs.com/zhang-yd/p/7397824.html