本文最后更新于: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;
}
};
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!