版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37964547/article/details/82194157
题目描述:
输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数)
样例展示:
输入sum=15;
打印出:1+2+3+4+5 、 4+5+6 、 7+8
解题思路:
- 用两个数字small和big分别表示序列的最大值和最小值,
- 首先将small初始化为1,big初始化为2.
- 如果从small到big的和大于sum,我们就从序列中去掉较小的值(即增大small),
相反,只需要增大big。 - 终止条件为:一直增加begin到(1+sum)/2并且end小于sum为止
代码实现:
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> array;
int small=1;
int big=2;
int mid=(1+sum)>>1;
while(small<big)//终止条件
{//利用滑动窗口计算和
int s=((big+small)*(big-small+1))>>1;
if(sum==s)//刚好相等
{
vector<int>res;
for(int i=small;i<=big;i++)
res.push_back(i);
array.push_back(res);
small++;//继续下一轮寻找
}
else if(s<sum)//小于给的sum,大数往后走
big++;
else//大于给的sum,去掉最小数
small++;
}
return array;
}
};