JZ42 和为S的两个数字
题目描述
思路分析
做法很多。最好的做法是双指针。(其他不是最优的做法有:哈希,二分等等)
反向双指针遍历。和小了就小指针右移,和大了就大指针左移。同时更新答案。
代码实现
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int num1=0,num2=0;
int l=0,r=array.size()-1;
while(l<r){
if(array[l]+array[r]==sum){
if(!num1&&!num2||array[l]*array[r]<num1*num2) num1=array[l],num2=array[r];
r--;
}
else if(array[l]+array[r]>sum){
r--;
}
else {
l++;
}
}
vector<int> res;
if(num1&&num2) res.push_back(num1),res.push_back(num2);
return res;
}
};