和为S的连续正整数序列

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路:定义范围不断向后扩展,如果当前范围内的和小于S;范围向后扩大一个,如果当前范围内的和大于S,范围缩小一个;如果相等,即为一个解。时间复杂度为O(n)
 1 class Solution {
 2 public:
 3     void pushToResult(vector<vector<int>> &res, int left, int right)
 4     {
 5         vector<int> tmp;
 6         while(left<=right)
 7         {
 8             tmp.push_back(left);
 9             ++left;
10         }
11         res.push_back(tmp);
12     }
13     vector<vector<int> > FindContinuousSequence(int sum) {
14         vector<vector<int>> res;
15         if(sum<=2)return res;
16         int left=1;
17         int right=2;
18         int total=3;
19         while(right<=sum/2+1)
20         {
21             if(total==sum)
22             {
23                 pushToResult(res, left, right);
24                 total=total-left;
25                 ++left;
26             }
27             else if(total<sum)
28             {
29                 ++right;
30                 total=total+right;
31             }else{
32                 total=total-left;
33                 ++left;
34             }
35         }
36         return res;
37     }
38 };

 

 

posted @ 2018-01-31 21:06  jeysin  阅读(191)  评论(0编辑  收藏  举报