题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
代码:
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> result; if (array.size() <2) return result; int left=0, right=array.size()-1; int num_a, num_b, product=array[right] * array[right]; bool valid = false; while(left < right) { if(array[left] + array[right] < sum) { left++; }else if(array[left] + array[right] > sum) { right--; } else if(array[left] + array[right] == sum && array[left] * array[right] < product) { num_a = array[left]; num_b = array[right]; product = array[left] * array[right]; valid = true; right--; } else { break; } } if (valid) { result.push_back(num_a); result.push_back(num_b); } return result; } };
和快排思想类似,就是同时从前往后和从后往前遍历.注意上述代码有个风险是两个数的乘积会不会过大.
来源:https://www.cnblogs.com/xl2432/p/10877682.html