题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
方法1:暴力法:枚举每个正整数为起点,判断以它为起点的序列和 sum 是否等于target
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> res;
vector<int> ans;
int s=0;
for(int i=1;i<=sum/2;i++)
{
ans.clear();
s=i;
ans.emplace_back(i);
for(int j=i+1;j<=(sum/2+1);j++)
{
ans.emplace_back(j);
if((s+j)<sum)
{
s+=j;
}
else if((s+j)==sum)
{
res.emplace_back(ans);
break;
}
else
{
break;
}
}
}
return res;
}
};
方法2:滑动窗口
/*
如果窗口中值的和小于目标值sum, 表示需要扩大窗口,j += 1
否则,如果狂口值和大于目标值sum,表示需要缩小窗口,i += 1
否则,等于目标值,存结果,i++缩小窗口,继续执行
*/
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> res;
vector<int> ans;
int left=1;
int right=2;
int s=0;
while(left<=sum/2)
{
int n=right-left+1;//表示窗口的长度
s=(left+right)*n/2; //窗口为奇数 (奇加奇=偶,偶加偶=偶),sum=(left+right)/2 *n
//窗口为偶数 (奇加偶为奇), sum=(left+right)*n/2
if(s<sum)
{
right++;
}
else if(s>sum)
{
left++;
}
else
{
ans.clear();
for(int i=left;i<=right;i++)
{
ans.emplace_back(i);
}
res.emplace_back(ans);
left++;
}
}
return res;
}
};