41和为S的连续正数序列+注意循环条件记一下这题特殊解法

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

思路:借鉴一下前面那题的思路,使用两个变量small和big,分别初始化为1,2,因为是连续几个数的和,如果tmp>um,需要循环的减去small,小于的时候加上比较大的big,数组要放在循环里面定义,这样不需要增加清空的代码。循环条件是small增加到(1+s)/2为止。不能是等于,只能小于,因为等于的时候会big= small,比如s=3的时候。

class Solution {
public:
    vector<int> pushres(int small,int big){
        
        vector<int> tmp;        
        for(int i = small;i <= big;++i){
            tmp.push_back(i);
        }
        return tmp;
    }
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > result;        
        int flag = 0;
        if(sum <= 2){
            return result;
        }
        int small = 1,big = 2;
        flag = small + big;
        int end = (1 + sum) / 2;
        while(small < end){//不需要判断small < big,这种情况因为small==big的情况才有可能等于sum,small<end,不可能出现这种情况
           vector<int> tmp;//不需要每次都清空tmp
            if((flag == sum)){                
                tmp = pushres(small,big);
                result.push_back(tmp);
            }
            while((small < end) && (flag > sum)){
                flag -= small;
                ++small;
                if((flag == sum) ){                
                tmp = pushres(small,big);
                result.push_back(tmp);
            }
                
            }
            ++big;
            flag += big;
        }
        return result;
    }
};

 

posted @ 2018-01-05 10:17  zqlucky  阅读(156)  评论(0编辑  收藏  举报