题目描述1 和为S的数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路:两个指针指向收尾,对于一个递增数组而言,乘积最小和为S的理想情况是左侧保持最小,
对于两个指针位置的数之和 大于S则将尾左移,小于S则将首右移
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> result;
if(array.empty())
return result;
vector<int>::iterator start,end;
for(start=array.begin(),end = array.end()-1;start<end;){
int cursum = *start + *end;
if(cursum>sum)
end--;
else if(cursum==sum)
{
result.push_back(*start);
result.push_back(*end);
break;
}
else if(cursum<sum)
start++;
}
return result;
}
};
题目描述2 和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路: 一定是增1的连续序列 且其中包含的数字个数大于等于2
可以参考两个指针一个指向头一个指向尾 同时设置头上的数不超过 (1+sum)/2来规避个数为1的情况
当总和>sum 时 左侧下标增加
< 右侧 增加
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>>result;
result.clear();
vector<int> res;
res.clear();
if(sum<=1)
return result;
int small=1,big=2;
res.push_back(small);
res.push_back(big);
int mid = (sum+1)/2;
int total=small + big;
while(small<mid){
if(total<sum)
{
res.push_back(++big);
total += big;
}
else if(total >= sum){
if(total==sum)
result.push_back(res);
res.erase(res.begin());
total -= small;
small++;
}
}
return result;
}
};