【剑指offer-解题系列(43)】和为S的两个数

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
分析
遍历数组查找一个数,然后使用upper查找另一个书所在的位置
代码实现
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值