zoukankan      html  css  js  c++  java
  • 程序员面试金典-整数对查找

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

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

      

  • 相关阅读:
    php 无限极分类
    高德地图随笔
    安全随笔
    关于专线映射问题
    js小技巧总结
    php+ajax 文件上传
    去除数组中重复的元素
    关于ueditor插入不了动态地图
    vue.js 安装
    js轮播
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/7397824.html
Copyright © 2011-2022 走看看