1. 题目

2. 解答

由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较。若小于目标和,第一个指针向前移动;若大于目标和,第二个指针向后移动。

若等于目标和,题目中要求输出乘积最小的。由于两个元素的乘积肯定小于目标和的平方,因此我们初始化目标和的平方为一个最小乘积。当找到两个元素和等于目标和的时候,如果他们的乘积小于最小乘积,则更新最小乘积以及这两个元素的索引值,然后两个指针分别向前向后移动一步继续寻找。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array, int sum) {
        
        vector<int> result;
        int n = array.size();
        if (n < 2)    return result;
        int first = 0;
        int last = n-1;
        int target = 0;
        int index1 = 0;
        int index2 = 0;
        int flag = 0;
        long long min_product = sum * sum;

        while (first < last)
        {
            target = array[first] + array[last];
            if (target == sum)
            {
                int product = array[first] * array[last];
                if (product < min_product)
                {
                    min_product = product;
                    index1 = first;
                    index2 = last;
                    flag = 1;
                }
                first++;
                last--;
            }
            else if (target < sum)  first++;
            else    last--;
        }
        if (flag)
        {
            result.push_back(array[index1]);
            result.push_back(array[index2]);
        }
        
        return result;       
    }
};

获取更多精彩,请关注「seniusen」!