题目描述
和为s的连续正数序列:输入一个正数s,打印出所有的和为s的连续正数序列(至少含有两个数)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列,1~5、4~6和7~8.
思路
使用两个数small和big表示序列最小值和最大值。通过small和big得到当前序列和。
- 如果序列和等于s,则输出序列,big++,得到新的序列和;
- 如果序列和大于s,则去掉一个最小值,即small++,得到新的序列和。
- 如果序列和小于s,则增加一个数big++,得到新的序列和。
- small初始化为1;
- big初始化为2;
- 注意结束条件 small<中位数 && big<中位数+1。
code
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> sequenceList;
if(sum<=0)
return sequenceList;
int small=1;
int big=2;
int sumCount=small+big;
int middle=sum/2+1;
while(small<middle&&big<=middle+1)
{
if(sumCount==sum)
{
vector<int> sequencetmp;
for(int i=small;i<=big;i++)
sequencetmp.push_back(i);
sequenceList.push_back(sequencetmp);
big++;
sumCount+=big;// update 序列和
}
if(sumCount<sum)
{
big++;
sumCount+=big;
}
if(sumCount>sum)
{
sumCount-=small;// update 序列和
small++;
}
}
return sequenceList;
}
};