劍指offer----和爲s的兩個數字

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

方法一:暴力解法:雙重遍歷

class Solution {
//暴力解決:雙重遍歷
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        //list用來存放要返回的數字
        vector<int> list;
        bool flag = false;
        int len = array.size();
        if(len < 2 || array[0] + array[1] > sum)
            return list;
        
        for(int i = 0; i < len-1; i ++){
            if(flag == true)
                break;
            for(int j = i + 1; j < len; j++){
                if(sum == array[i] + array[j]){
                    list.push_back(array[i]);
                    list.push_back(array[j]);
                    flag = true;
                    break;
                }
            }
        }
        return list;
    }
};

方法二:對撞指針(兩個數字離得越遠乘積越小,對撞指針剛好滿足)

class Solution {
// 使用對撞指針start end
// 當和大於sum時,end--
// 當和小於sum時,start++
// 當和等於sum時,將array[start],array[end]輸出
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        //list用來存放要返回的數字
        vector<int> list;
        int len = array.size();
        if(len < 2 || array[0] + array[1] > sum)
            return list;
        int start = 0;
        int end = len -1;
        while(start < end){
            if(array[start] + array[end] == sum){
                list.push_back(array[start]);
                list.push_back(array[end]);
                break;
            }
            else if(array[start] + array[end] > sum){
                end --;
            }
            else
                start ++;
        }
        return list;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章