剑指 Offer——和为 S 的两个数字
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」!