您的位置:首页 > Web前端

【剑指offer-解题系列(42)】和为S的连续正数序列

2017-05-30 11:10 399 查看


题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 
[b]输出描述:[/b]
对应每个测试案例,输出两个数,小的先输出

分析
采用二分搜索得到一个数位置,然后可以通过大小判断另一个数字的位置,只需要查找另一半就行。

代码实现
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {

        vector<int>res;

        if(array.size()<=0)

            return res;
        int mul = INT_MAX;

        int last_a;

        int last_b;

        int count=0;

        for(auto it = array.begin();it!=array.end();it++){

         int a =*it;

            int b =sum-a;

            if(-1!= upper( array , b ,  0, array.size())){

                count++;

                if(a*b<mul){

                    mul=a*b;

                    last_a=a;

                    last_b=b;

                }

            }

        }

        if(count>0){

            res.push_back(last_a);

            res.push_back(last_b);

        }

        return res;

    }

   

    int upper(vector<int> &data ,int k,  int start, int end){

        if(start == end ){

            if(data[end] == k)return end;

            else return -1;

        }

        int mid =  (start + end)/2;

        if( data[mid] >  k  )return upper( data ,  k ,   start,   mid);

        if( data[mid] <  k  )return upper( data ,  k ,   mid+1,   end);
        if( data[mid] ==  k  ){

            if( mid<end&&data[mid+1]!=k  )

                return mid;

            else

                return upper( data ,  k ,   mid+1,   end);

        }

        return -1;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: