输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
设定一个类似于变长滑动窗的结构,首先窗中只有,1,2两个元素,若窗中元素和小于目标,则窗想右增长一位,若窗中元素和大于目标值,则窗左边缩减一位,直到窗的左边大于目标值一半或者窗的右边等于目标值,则遍历停止,代码如下:
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
int left=1,right=2;
int res=3,i;
vector<int> temp;
vector<vector<int>> result;
while(left<=sum/2 && right<sum){
if(res<sum) res+=++right; //向右扩容
else if(res>sum) res-=left++; //向左剔除
else{
for(i=left;i<=right;i++) temp.push_back(i);
result.push_back(temp);
temp.clear();
res+=++right; //当找到相等时,需要继续扩容,否则就会死循环
}
}
return result;
}
};