【劍指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;
}

發佈了81 篇原創文章 · 獲贊 19 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章