题目:
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15;所以打印出三个连续序列1~5,4~6,7~8。
思路:
从递增数组中两个数和为s的数得到启示,我们也可以设置两个指针,一个指向当前序列的最小的数,一个指向当前序列最大的数。
设置两个指针,一个为small指向当前正数序列中最小的数,一个为big指向当前正数序列中最大的数;
若是当前的正数序列之和大于S,那么缩小序列范围,让small指针不停往前走,直到等于或者大于S停止;
若是当前的正数序列之和小于S,那么扩大序列范围,让big指针不停往前走,直到和等于或者大于S停止;
vector<vector<int> > FindContinuousSequence(int sum)
{
vector<vector<int> > res;
vector<int> temp;
if (sum < 3)
return res;
int small = 1;//用来记录正整数序列中最小的数
int big = 2;//用来记录正整数序列中最大的数
int middle = (1 + sum) / 2;
int curSum = small + big;//当前序列总和
temp.push_back(small);
temp.push_back(big);
while (big <= middle)
{
if (curSum < sum)
{
++big;
curSum += big;
temp.push_back(big);
continue;
}
else if (curSum > sum)
{
curSum -= small;
++small;
vector<int>::iterator ite = temp.begin();
temp.erase(ite);
continue;
}
else
{
res.push_back(temp);
++big;
temp.push_back(big);
curSum += big;
}
}
return res;
}