偏数学思路

看大家都在双指针滑动窗口,要么就是遍历。
提供一个偏数学的思路。十行代码解决问题,复杂度为
等差数列的数字个数为n,起始数字为a,
主要思路是在合适范围内遍历n,然后求解a判断是否为整数,若为整数则ok。
代码如下,具体公式推导在后边。
class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        double n =int(0.5+sqrt(2*sum+1/4));//数列长度上限
        vector<vector<int>> res;
        while(n>1){
            if(sum/n+(1-n)/2 - int(sum/n+(1-n)/2)==0){//判断计算结果为整数,sum/n+(1-n)/2表示的是数列第一个数字。
            vector<int> res_unit(n);//其中一种结果
            iota(res_unit.begin(),res_unit.end(),sum/n+(1-n)/2);//生成一个起始为sum/n+(1-n)/2,长度为n的数列。
            res.push_back(res_unit);}//所有的结果
            n--;}
        return res;}};


公式推导

设等差数列的数字个数为n,起始数字为a,其和为sum,则满足
可以得到

其中在本题定义域内,n是a的减函数,取a = 1,可得

可以将n的范围确定下来,大概在2和之间,复杂度为级别。
接下来遍历n,求解a


若a为整数,则是一种合格的情况。