【剑指offer】和为S的连续整数序列

找到所有和为S的连续整数序列,序列长度>=2

 

我的思路:数学法,限定首元素范围,计算序列长度。

书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标。

 

我的解法:

/*
​直接用数学方法做的
等差数列公式  2*n*a1+n(n-1)/2 = s; 由n>= 2 得 a1 <= (s - 1)/2
对首位数字a1从1到 (s - 1)/2遍历
等差数列公式变形   n*n+(2*a1 - 1)n-2s = 0
可得                        n = [-(2a - 1) + sqrt((2a - 1) * (2a - 1) + 8s)]/2
检验n是否为整数,是则得到一个答案
*/
class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > ans;
        int maxA1 = (sum - 1) / 2; //sum = n*a1 + n(n-1)/2 n最小为2 推导得到
        for(int i = 1; i <= maxA1; i++) //首位数字遍历
        {
            double f = (sqrt(double((2 * i - 1) * (2 * i - 1) + 8 * sum)) + 1 - 2 * i) / 2; //计算长度
            int n = int(f);
            if(abs(f - n) < 0.000001) //长度是整数,有效
            {
                vector<int> tempans;
                for(int j = 0; j < n; j++)
                    tempans.push_back(i + j);
                ans.push_back(tempans);
            }
        }
        return ans;
    }
};

 

posted @ 2015-07-14 22:31  匡子语  阅读(334)  评论(0)    收藏  举报