剑指offer之【和为S的连续正数序列】

题目:

  和为S的连续正数序列

链接:

  https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

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

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

思路:

  设置一个path变量,存放当前的数字序列,和一个csum代表当前序列的和,如果csum>sum 则去除小值,如果<sum, 增加大值,如果==sum则打印

代码:

  

 1 class Solution {
 2 public:
 3     vector<vector<int>> FindContinuousSequence(int sum){
 4         if(sum <= 2){
 5             return res;
 6         }
 7         path = {1};
 8         int csum =1;
 9         for(int i = 2;i<= (sum+1)/2;++i){
10             path.push_back(i);
11             csum += i;
12             if(csum == sum ){
13                 res.push_back(path);
14             }
15             else{
16                 while(csum>sum){
17                     csum -= path[0];
18                     path.erase(path.begin());
19                 }
20                 if(csum == sum){
21                     res.push_back(path);
22                 }
23             }
24         }
25         return res;
26     }
27 private:
28     vector<vector<int>> res;
29     vector<int> path;
30 };
原文地址:https://www.cnblogs.com/wangshujing/p/6945803.html