您的位置:首页 > Web前端

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

2015-07-14 22:31 155 查看
找到所有和为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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: