劍指offer——和爲S的兩個數字

題目描述:
輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。

輸出描述:
對應每個測試案例,輸出兩個數,小的先輸出。

思路:遍歷數組,先找到第一個數data1data1,然後再在數組中找另外一個數sumdata1sum-data1。設置一個全局乘積最小值變量multiMinmultiMin用來記錄乘積最小的兩個數字。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        if(array.empty())
            return {};
        int multiMin=INT_MAX;
        vector<int> res;
        for(int i=0;i<array.size();i++){
            int data1=array[i];
            vector<int>::iterator it=find(array.begin(),array.end(),sum-data1);
            if(it!=array.end()){
                if(data1*(*it)<multiMin){
                    res.clear();
                    res.push_back(data1);
                    res.push_back(*it);
                    multiMin=data1*(*it);
                }
            }
        }
        return res;
    }
};

思路2:採用雙指針法

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        if(array.empty())
            return {};
        int left=0;
        int right=array.size()-1;
        int multiMin=INT_MAX;
        vector<int> res;
        while(left<right){
            long long cur=array[left]+array[right];
            if(cur==sum){
                if(array[left]*array[right]<multiMin){
                    multiMin=array[left]*array[right];
                    res.clear();
                    res.push_back(array[left]);
                    res.push_back(array[right]);
                }
                //此情況left和right同時發生變化
                left++;
                right--;
            }else if(cur<sum){
                left++;
            }else{
                right--;
            }
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章