题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
首先,和为S的两个数字,差越大则乘积越小
所以,思路有下面两种:
1. 数组已排序,则从小到大,使用二分查找方法,第一组和为S的即为结果
2. 设置头尾两个指针,如果
和大于S 则right--
和小于S 则left--
代码如下:
class Solution {
public:
//和为S的两个数字,差越大,乘积越小
//方法一:数组已递增排序,则从小到大,第一组和为S的两个数即为结果,使用二分查找
vector<int> find_numbersum_binary(vector<int>& array, int sum){
vector<int> result;
if(0 == array.size())
{
return result;
}
for(int i = 0; i < array.size()-1; i++){
int t = sum - array[i];
int l = i + 1;
int r = array.size() - 1;
while(l <= r){
int mid = (l + r)/2;
if(array[mid] == t){
result.push_back(array[i]);
result.push_back(array[mid]);
return result;
}
else if(array[mid] < t){
l = mid + 1;
}
else{
r = mid - 1;
}
}
}
return result;
}
//方法二:设置头尾两个指针,
// 和大于S 则right-- 和小于S 则left--
vector<int> find_numbersum_2pointer(vector<int>& array,int sum){
vector<int> result;
if(0 == array.size()){
return result;
}
int left = 0;
int right = array.size() - 1;
while(left < right){
if(array[left] + array[right] > sum){
right--;
}
else if(array[left] + array[right] < sum){
left++;
}
else{
result.push_back(array[left]);
result.push_back(array[right]);
return result;
}
}
return result;
}
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
//return find_numbersum_binary(array, sum);
return find_numbersum_2pointer(array, sum);
}
};