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

题目:

 

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

 

解答:

方法1:

暴力就完事了嗷

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        vector<int> cur;
        for(int i=target/2+1;long(i)*(i+1)>=2*target;--i){
            int p=target,j=i;
            while(p>0 and p>=j){
                p-=j;
                --j;
            }
            if(p==0){
                for(int k=j+1;k<=i;++k){
                    cur.emplace_back(k);
                }
                res.emplace_back(move(cur));
            }
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

方法2:

滑动窗口,因为是连续的数字和,挺明显要用滑窗的。。应该做题时能注意到这个信息点的阿。o(︶︿︶)o 唉

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        int le=1,ri=1,cur_sum=0;
        while(ri<target/2+3){
            while(cur_sum<target){
                cur_sum+=ri++;
            }
            if(cur_sum==target){
                res.push_back({});
                for(int i=le;i<ri;++i){
                    res.back().emplace_back(i);
                }
                cur_sum+=ri++;
            }
            else{//>
                while(cur_sum>target){
                    cur_sum-=le++;
                }
            }
        }
        return res;
    }
};

 

posted @ 2020-03-06 19:36  NeoZy  阅读(183)  评论(0编辑  收藏  举报