【41】和为S的连续正数序列
- 时间限制:1秒
- 空间限制:32768K
题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
牛客网题目链接:点击这里
VS2010代码
//Source: http://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
//Author: Yang Qiang
//Date : 2016-8-6
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector< vector<int> > result;
if(sum<2) return result;
// 定义一个可扩展的区间
int begin=1; //初始化
int end=2;
int sumBeginEnd=3;
while(begin<end && end<sum)
{
//求出区间内的和
if(sumBeginEnd==sum)
{
vector<int> temp;
for(int i=begin; i<=end; i++)
temp.push_back(i);
result.push_back(temp); //存储结果
begin++; //重新复位
end=begin+1;
sumBeginEnd=begin+end;
}
else if(sumBeginEnd<sum)
{
end++;
sumBeginEnd+=end;
}
else
{
if(begin<(sum/2))
{
begin++;
end=begin+1;
sumBeginEnd=begin+end;
}
else
return result;
}
}
return result;
}
};
//测试用例:
//1. 15. 输出:1,2,3,4,5; 4,5,6; 7,8。