您的位置:首页 > Web前端

剑指Offer——(42)和为S的连续正数序列

2017-07-26 20:57 344 查看
题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!

实现如下:

//初始little数值为1,big数值为2
//当count等于sum时,添加序列
//否则判断
//当count大于sum时,后移little,big不动,使count减小,过程中count等于sum时,添加序列,直到little等于big
//当count小于sum时,后移big,使count增大
//直到little等于middle
//注意判断sum的值是否合法
class Solution
{
public:
vector<vector<int>> FindContinuousSequence(int sum)
{
vector<vector<int>> vec;
if (sum < 3)//防御性动作
return vec;
int little = 1;//左边界,即最小值
int big = 2;//右边界,即最大值
int middle = (sum + 1) / 2;//中间值
int count = little + big;//记录序列之和
while (little < middle)
{
if (count == sum)//当count等于sum使,添加序列
{
vector<int> tmp;
for (int i = little; i <= big; ++i)
tmp.push_back(i);
vec.push_back(tmp);
}
while (count > sum && little < middle)//此时count大于sum
{
count -= little;//减小count
++little;//后移最小值
if (count == sum)//count等于sum时,添加序列
{
vector<int> tmp;
for (int i = little; i <= big; ++i)
tmp.push_back(i);
vec.push_back(tmp);
}
}
++big;//此时,count小于sum,后移最大值,使count增大
count += big;
}
return vec;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息