JZ41 和为S的连续正数序列**
题目描述
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路
(讨论中的思想)
滑动窗口思想
假设有一个连续序列,定义一个滑动窗口,通过改变窗口的左右边界来改变窗口里面的值的和(注意一下:**窗口的边界需要有规律地移动,比如从左往右,不能像左移动,否则就乱套了)
- 初始化左右边界(左:1,右:2)
- 当窗口中的值的和=目标值时,将窗口里的值存放进临时数组中(窗口中的值的和可以用求和公式来求);存完以后要进行清空临时数组,并且将左窗口右移,以便求下一组满足条件的序列;
- 当窗口中的值的和>目标值时,左窗口右移;
- 当窗口中的值的和<目标值时,右窗口左移;
- 注意一下循环结束条件:当左窗口大于或等于右窗口时结束循环
代码
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<int> seq;
vector<vector<int>> res;
int low=1,high=2;//滑动窗口的边界
int cur;//计算窗口里的总和
while(low<high)
{
cur=(low+high)*(high-low+1)/2;
if(cur==sum)
{
for(int i=low;i<=high;i++)
seq.push_back(i);
res.push_back(seq);
seq.clear(); //当前序列加入结果中就可以清空了
low++; //每次都先固定左边界,固定好了之后再去移动右边界
}
else if(cur<sum)
high++;
else
low++;
}
return res;
}
};