1. 题目
2. 解答
由于数组是已经排好序的,我们可以定义两个指针,第一个指针指向第一个元素,第二个指针指向最后一个元素,然后求出这两个元素的和,与目标和进行比较。若小于目标和,第一个指针向前移动;若大于目标和,第二个指针向后移动。
若等于目标和,题目中要求输出乘积最小的。由于两个元素的乘积肯定小于目标和的平方,因此我们初始化目标和的平方为一个最小乘积。当找到两个元素和等于目标和的时候,如果他们的乘积小于最小乘积,则更新最小乘积以及这两个元素的索引值,然后两个指针分别向前向后移动一步继续寻找。
时间复杂度 \(O(n)\),空间复杂度 \(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」!
来源:https://www.cnblogs.com/seniusen/p/10626780.html