剑指offer 042、和为S的两个数字
题目
题解
和41题很像,设置两个头尾指针
-
若ai + aj == sum,就是答案(相差越远乘积越小)
证明相差越远,乘积越小:
设x+y=C(C是常数),y-x=d>=0
即x=(C-d)/2,y=(C+d)/2
x*y=(C^2 - d^2)/4,画出图形:x*y是一个关于y轴对称的,开口向下的,变量为d的函数。d>=0,d越大,x*y越大。 -
若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j –
-
若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i ++
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> result;
int low = 0, high = array.size() - 1;
while (low < high) {
if (array[low] + array[high] == sum) {
result.push_back(array[low]);
result.push_back(array[high]);
break;
}
else if (array[low] + array[high] < sum) {
low++;
}
else {
high--;
}
}
return result;
}
};