题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出:所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
分析:
方法(1):将数据尾插到一个临时的vector,每尾插一个数据,就求和看是否等于要求的数,如果等于将该临时vector元素尾插到二维的vector中,并且清空临时vector,并且下一次从上一次的起始位置的下一个位置开始(for循环上去自己会加i)
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> vv;
int k = 0;
vector<int> tmp;
int begin = 0;
for (int i = 1; i<sum/2+2; i++)
{
begin = i;
int tmp_sum = 0;
tmp.clear();
while (i<sum && tmp_sum<sum)
{
tmp.push_back(i);
tmp_sum = accumulate(tmp.begin(), tmp.end(), 0);
i++;
}
if (i<=sum && tmp_sum == sum)//找到与sum相等的子序列之和
{
//vv[k++] = tmp;
vv.push_back(tmp);
i = begin;//从该序列的下一个元素开始
}
else if (i<sum && tmp_sum>sum)//超过了
{
i = begin;//从该序列的下一个元素开始
}
else//说明i==sum了
{
break;
}
}
return vv;
}
方法(2):双指针法+等差数列求和
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> vv;
int first=1;//前指针
int last=2;//后指针
while(first<last)//至少有两个值
{
int cur=((first+last)*(last-first+1))/2;
if(cur==sum)
{
vector<int> tmp;
for(int i=first;i<=last;i++)
{
tmp.push_back(i);
}
vv.push_back(tmp);
first++;
}
else if(cur<sum)
{
last++;
}
else if(cur>sum)
{
first++;
}
}
return vv;
}