42. 和为S的两个数字

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

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

思路:

定义两个指针,一个指向数组首元素,一个指向数组最后一个元素,计算两个元素的和,如果和小于sum,那么第一个指针向后移,反之,第二个指针向前移。

关于输出的描述:可以看一个例子,例如 1 2 3 4 5 6 7,sum = 8,可以看出复合要求的两个数字的乘积分别为:1*7=7,2*6=12,3*5=15.可以看出,这两个符合要求的数字,较小的数字越小,较大的数字越大,那么其乘积越小。所以,按照上述思路遍历的时候,最先找到的那一对数字就是要求的数字。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        if(array.size() <= 0)
            return vector<int> ();
        int p1 = 0, p2 = array.size() - 1;
        vector<int> num;
        while(p1 < p2)
        {
            if(array[p1] + array[p2] == sum)
            {
                num.push_back(array[p1]);
                num.push_back(array[p2]);
                break;
            }
            else if(array[p1] + array[p2] < sum)
                ++ p1;
            else
                -- p2;
        }
        return num;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_39605679/article/details/81393846
42.