找到所有和为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; } };