和为S的连续正数序列
思路:
用两个数small和big分别表示序列的最小值和最大值。
首先把small初始化为1,big初始化为2.
如果从small到big的序列的和大于sum,就去掉序列中最小的值,也即是增大small的值;
如果和小于sum,那就让这个序列包含更多的数字,因为,这个序列至少要两个数字,所以一直增加到 (1+s)/2 。
以求和为9的所有序列为例子:
1 class Solution { 2 public: 3 vector<vector<int> > FindContinuousSequence(int sum) { 4 vector<vector<int> > res; 5 if(sum<3) return res; 6 int small=1; 7 int big=2; 8 int middle = (sum+1)/2; 9 int cursum = small + big; 10 while(small<middle){ 11 if(cursum==sum) gettempvec(small,big,res); 12 while(cursum>sum && small<middle){ 13 cursum-=small; 14 small++; 15 if(cursum==sum) gettempvec(small,big,res); 16 } 17 big++; 18 cursum+=big; 19 } 20 return res; 21 } 22 void gettempvec(int start,int end,vector<vector<int> > &res){ 23 vector<int> vec; 24 for(int i=start;i<=end;i++){ 25 vec.push_back(i); 26 } 27 res.push_back(vec); 28 } 29 };