5-剑指offer: 和为S的两个数字

题目描述

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

输出描述:

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

代码:

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> result;
        if (array.size() <2)
            return result;
        int left=0, right=array.size()-1;
        int num_a, num_b, product=array[right] * array[right];
        bool valid = false;
        
        while(left < right) {
            if(array[left] + array[right] < sum) {
                left++;
            }else if(array[left] + array[right] > sum) {
                right--;
            } else if(array[left] + array[right] == sum && array[left] * array[right] < product) {
                num_a = array[left];
                num_b = array[right];
                product = array[left] * array[right];
                valid = true;
                right--;
            } else {
                break;
            }
        }
        if (valid) {
            result.push_back(num_a);
            result.push_back(num_b);
        }
        
        return result;
    }
};

和快排思想类似,就是同时从前往后和从后往前遍历.注意上述代码有个风险是两个数的乘积会不会过大.

posted @ 2019-05-16 20:03  星星,风,阳光  阅读(97)  评论(0编辑  收藏  举报