题:输入一个正整数target,输出所有和为target的连续正整数序列(至少包含两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
解决办法:滑动窗口法:(窗口始终向一个方向移动)
序列起始位置为i,终止位置为j(区间为[i,j)):
①当i~j内的序列和小于target时,i不动,j++;
②当i~j内的序列和大于target时,j不动,i++;
③当i~j内的序列和等于target时,保存序列内的值。
class Solution
{
public:
vector<vector<int>> findSequence(int target)
{
int left=1;//窗口左边界
int right=1;//窗口右边界
int sum=0;//序列和
vector<vector<int>> ans;
while(left<=target/2)
{
if(sum<target)
{
sum+=right;//右边界右移
right++;
}
else if(sum>target)
{
sum-=left;//左边界右移
left++;
}
else
{
vector<int> temp;
for(int k=i;k!=j;k++)
{
temp.push_back(k);
}
ans.push_back(temp);
sum-=i;//左边界右移,寻找下一个符合条件的序列
i++;
}
}
return ans;
}
};