和为s的连续正数序列

题目描述

和为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;
    }
};

猜你喜欢

转载自blog.csdn.net/ytang_/article/details/79905207