【题目】
输入一个正数s,打印出所有和为s的连续正数序列(至少包含两个数)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列1~5,4~6,7~8。
【基本思路】
使用两个指针small和big,small表示连续序列的首元素,big表示连续序列的尾元素,初始时small = 1,big = 2。此时序列的累加和total = 3。如果累加和小于s,则扩大序列,即big指针向右移动一位,调整total后继续和s比较;如果累加和大于s,则缩小序列,即small指针向右移动一位,调整total后继续和s比较。不断的扩大或缩小序列,直到累加和等于s,此时打印该序列,然后令small加1继续调整序列寻找下一个序列。
由于序列中至少要包含两个元素,所以,small的值增加到(1+s) / 2就停止。
【代码实现】
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> array;
if(sum < 3){
return array;
}
int small = 1;
int big = 2;
int mid = (1 + sum) / 2;
int total = 3;
while(small < mid){
if(total > sum){
total -= small;
small++;
}
else if(total < sum){
big++;
total += big;
}
else{
vector<int> arr;
for(int i=small; i<=big; i++){
arr.push_back(i);
}
array.push_back(arr);
total -= small;
small++;
}
}
return array;
}
};