题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路

这道题的特殊之处在于所有的序列都是连续的,因此就容易想到数列的求和公式,只要知道整个序列中的第一个数和最后一个数就可以知道整个序列的和是否为sum,

然而问题来了,序列中的第一个数和最后一个数应该怎么得到呢,

这时我们就应该想到用我们常见的双指针滑动窗口来解决这种问题,

如果窗口内的和小于sum,我们就向后移动右指针;如果大于sum,就移动窗口的左指针。

下面结合代码捋一遍

代码

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> res;
        //利用双指针滑动窗口
        int l = 1;//左指针
        int r = 2;//右指针
        while(l < r){  //注意序列至少包括两个数
            int ans = (l+r)*(r-l+1)/2;//连续序列利用求和公式
            if(ans == sum){
                vector<int> t;
                for(int i = l; i <= r; i++)
                    t.push_back(i);
                res.push_back(t);
                l++;
                r++;
            }
            else if(ans < sum)
                r++;
            else
                l++;
        }
        return res;
    }
};