题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:首先想到的是暴力解法,时间复杂度为O(n^2):固定一个数字,然后逐个求和并与sum比较。
for(int i=0;i<len;i++)
for(int j=i+1;j<len;j++)
但题目中给出的数组有一个条件,该序列是递增序列,可以利用这个条件。定义两个指针,一个指向最小的数int begin=0,一个指向最大的数int end=len-1,求两者的和,如果和大于要求的sum,则将end左移,小于sum,则将begin右移。至于乘积,因为是递增序列,符合sum条件的两个数,其中一个越靠左,乘积越小,所以按这个方法,最先找到的符合条件的两个数,即为返回值。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> result;
int len = array.size();
int begin = 0;
int end =len - 1;
while(begin < end){
if(array[begin] + array[end] == sum){
result.push_back(array[begin]);
result.push_back(array[end]);
break;
}
if(array[begin] + array[end] > sum){
end--;
}
if(array[begin] + array[end] < sum){
begin++;
}
}
return result;
}
};