本文最后更新于:2020年7月1日 晚上

题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出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;
	}
};