和为S的连续正整数序列
双指针问题。第一个指针指向队列的头,第二个指针指向队列的尾。第一个指针最多指向中间元素。如果当前序列的和大于S,那么第一个指针向前走;如果当前序列和小于S,第二个指针往后走。
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > res;
if(sum<3)
return res;
int left=1,right=2;
int curSum=3;
while(left<right&&left<(1+sum)/2) {
if(curSum==sum) {
vector<int> vec;
for(int i=left;i<=right;++i)
vec.push_back(i);
res.push_back(vec);
curSum-=left;
++left;
}
else if(curSum>sum) {
curSum-=left;
++left;
}
else {
++right;
curSum+=right;
}
}
return res;
}
和为S的两个数字
在递增数组中找出两个数字的和为S。同样的方法,只不过两个指针初始值分别指向数组的头部和尾部。
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int n=array.size();
int left=0,right=n-1;
vector<int> res;
int mult=INT_MAX,curSum=0;
while(left<right) {
curSum=array[left]+array[right];
if(curSum==sum) {
//题目要求寻找乘积最小的那组
if(array[left]*array[right]<mult) {
mult=array[left]*array[right];
vector<int> vec;
vec.push_back(array[left]);
vec.push_back(array[right]);
res=vec;
}
++left;
--right;
}
else if(curSum>sum)
--right;
else
++left;
}
return res;
}