57-02 和为s的连续正数序列

题目

输入一个整数s,打印所有和为s的连续正数序列(至少两个)。例如,输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出三个连续序列15,46,7~8。

牛客网 OJ
AcWing OJ

C++ 题解

这里也考虑两个数small和big分别表示序列的最小值和最大值。
首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。
如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。
因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum)
    {
        vector<vector<int> > res;
        if(sum < 3) 
            return res;
        
        int mid = (sum + 1)>>1;
        int begin = 1;
        int end = 2;
        int cur = begin + end;
        while(begin < mid && end < sum)
        {
            while(cur > sum)
            {
                cur -= begin;
                begin++;
            }
            if(cur == sum)
                InsertRes(begin,end,res);
             end++;
             cur += end;
        }
        return res;
    }
    
    void InsertRes(int begin,int end,vector<vector<int> > &res)
    {
        vector<int> temp;
        for(int i = begin;i<=end;i++)
            temp.push_back(i);
        res.push_back(temp);
    }
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code 
        if tsum<3:
            return []
        small,big=1,2
        middle=(tsum+1)//2
        curSum=small+big
        res=[]

        while (small<middle):
            if curSum==tsum:
                res.append(list(range(small,big+1)))
            while(curSum>tsum and small<middle):
                curSum -= small
                small +=1
                if curSum==tsum:
                    res.append(list(range(small,big+1)))
            big+=1
            curSum +=big
        return res
posted @ 2019-03-17 15:10  youngliu91  阅读(92)  评论(0)    收藏  举报