求和为sum的连续正序数列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37964547/article/details/82194157

题目描述:

输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数)

样例展示:

输入sum=15;
打印出:1+2+3+4+5 、 4+5+6 、 7+8

解题思路:

  • 用两个数字small和big分别表示序列的最大值和最小值,
  • 首先将small初始化为1,big初始化为2.
  • 如果从small到big的和大于sum,我们就从序列中去掉较小的值(即增大small),
    相反,只需要增大big。
  • 终止条件为:一直增加begin到(1+sum)/2并且end小于sum为止

代码实现:

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> array;

        int small=1;
        int big=2;
        int mid=(1+sum)>>1;
        while(small<big)//终止条件
        {//利用滑动窗口计算和
            int s=((big+small)*(big-small+1))>>1;
            if(sum==s)//刚好相等
            {
                vector<int>res;
                for(int i=small;i<=big;i++)
                    res.push_back(i);
                array.push_back(res);
                small++;//继续下一轮寻找
            }
            else if(s<sum)//小于给的sum,大数往后走
                big++;
            else//大于给的sum,去掉最小数
                small++;
        }
        return array;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37964547/article/details/82194157