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

北战南征 提交于 2019-12-17 00:13:18

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

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

思路:至少有两个数字在正数序列中,设置两个变量small(指向该序列最小的元素),big(指向该序列最大的元素)。统计从small到big所有数的加和为cur。如果cur==sum,则找到一种序列组合,如果cur<sum,则big增加,如果cur>sum,则small增加,这样只要找到一组序列组合,就将它加入到res中。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        if(sum<3)
            return {};
        int small=1;
        int big=2;
        int mid=sum/2;
        int cur=small+big;
        vector<vector<int>> res;
        vector<int> temp;
        while(small<=mid){
            if(cur==sum){
                output_(small,big,temp,res);
            }
            while(cur>sum&&small<=mid){
                cur-=small;
                small++;
                if(cur==sum)
                    output_(small,big,temp,res);
            }
            big++;
            cur+=big;
        }
        return res;
    }
    void output_(int small,int big,vector<int> temp,vector<vector<int>>& res){
        for(int i=small;i<=big;i++)
            temp.push_back(i);
        res.push_back(temp);
    }
};
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!