和为S的两个数字

和为S的两个数字

题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:

对应每个测试案例,输出两个数,小的先输出。

使用两个游标head和tail分别指向数组头部和尾部, 两个游标向彼此方向移动. 当两个游标和为sum时, 判断大小并插入ret中; 当两个游标和小于sum时, head向后移动; 当两个游标和大于sum时, tail向前移动

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> ret;
        if (array.empty())
            return ret;
        
        int head = 0;
        int tail = array.size() - 1;
        while(head < tail) {
            // 相等时
            if (sum == (array[head] + array[tail])) {
                if (ret.empty()) {    // 判断ret是否空
                    ret.push_back(array[head]);
                    ret.push_back(array[tail]);
                }
                else { 
                    if ((ret[0] * ret[1]) > (array[head] * array[tail])) {
                        ret[0] = array[head];
                        ret[1] = array[tail];
                    }
                }
                head++;
                tail--;
                continue;
            }
            if (sum > (array[head] + array[tail])) {
                head++;
                continue;
            }
            if (sum < (array[head] + array[tail])) {
                tail--;
                continue;
            }
        }
        return ret;
    }
};

暴力法, 牛客没通过, 应该超时了

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> ret;
        for (int i = 0; i < array.size() - 1; i++) {
            for (int j = i + 1; j < array.size(); j++) {
                if (sum == (array[i]+array[j])) {
                    ret.push_back(array[i]);
                    ret.push_back(array[j]);
                    return ret;
                }
            }
        }
        return ret;
    }
};
原文地址:https://www.cnblogs.com/hesper/p/10529701.html