和为S的连续正整数序列

Posted Jeysin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了和为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 };

 

 

以上是关于和为S的连续正整数序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer——和为s的连续正整数序列

和为S的连续正整数序列

和为S的连续正整数序列

LeetCode-滑动窗口和为s的连续正数序列

剑指 Offer 57 - II. 和为s的连续正数序列

LeetCode——面试题57 - II. 和为s的连续正数序列