牛客网-剑指office-和为S的连续正数序列

题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
思路:我们用两个变量small和big分别记录序列的最小值和最大值,并且将两者分别初始化为1和2,用cursum记录从small到big范围内数的和,当cursum等于sum时,将从small到big的序列输出。如果cursum小于sum时,增大big,如果cursum大于sum时,增大small。直到small大于或等于sum的一半。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        if(sum<2) return {};
        vector<vector<int> > ans;
        int small = 1;
        int big =2;
        int mid=(small+sum)/2;
        int cursum=small+big;
        while(small<mid)
        {
            if (cursum ==sum)
                ans.push_back(result(small,big));
            while(cursum>sum&&small<mid)
            {
                cursum-=small;
                ++small;
                if (cursum ==sum)
                ans.push_back(result(small,big));
            }
            ++big;
            cursum+=big;
        }
        return ans;
    }
    vector<int> result(int small,int big)
    {
        vector<int> ans;
        for(int i=small;i<=big;++i)
            ans.push_back(i);
        return ans;
    }
};

python的解法:

# -*- coding:utf-8 -*-
class Solution:
    def FindContinuousSequence(self, tsum):
        # write code here
        if tsum <= 2:
            return []
        ans = []
        small = 1
        big = 2
        mid = int((small + tsum) / 2)
        cursum = small + big
        while small < big and small < mid:
            if cursum == tsum:
                ans.append(self.result(small, big))
            while cursum > tsum and small < mid:
                cursum -= small
                small += 1
                if cursum == tsum:
                    ans.append(self.result(small, big))
            big += 1
            cursum += big
        return ans

    def result(self, small, big):
        ans = []
        while (small <= big):
            ans.append(small)
            small += 1
        return ans


猜你喜欢

转载自blog.csdn.net/qq_43387999/article/details/91345905