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

 

posted @ 2019-07-16 16:35  Austin_anheqiao  阅读(131)  评论(0编辑  收藏  举报