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; } };