基本思路:滑动窗口,维护左端点l与右端点r,由于至少有两个数,所以循环终止条件为l < r。

通过左端点与右端点可以算出区间和,如果大于目标则右移左端点,小于则右移右端点,等于则将滑动窗口内的数存储在结果中。

由于每次只滑动一个数,且要求的是区间和,所以区间和可以在滑动窗口滑动时计算,避免了乘法运算。

class Solution {
public:
    vector<vector<int>> FindContinuousSequence(int sum) {
        vector<vector<int>> res;
        int l = 1, r = 2, nows = 3;
        while (l < r) {
            if (nows == sum) {
                vector<int> tmp;
                for (int i = l; i <= r; i++) {
                    tmp.push_back(i);
                }
                res.push_back(tmp);
                nows -= l++;
            }
            else if (nows > sum) {
                nows -= l++;
            }
            else {
                nows += ++r;
            }
        }
        return res;
    }
};