和爲s的連續正數系列(31)

題目

【輸出所有和爲S的連續正數序列(至少含有兩個數)。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序】


1、分析
由於數是連續的正數,且至少爲兩個數,所以最小的組合爲 [ 1 , 2 ],和最小爲3。可以使用兩個數 small 和 big 分別表示序列的最小值和最大值。首先把small 初始化爲1,big初始化爲2。如果從small到big的序列和大於s ,則可以從序列中去掉較小的值,即small++。如果從small到big 的序列和小於s,則可以增大 big,從而讓序列包含更多的數字。因爲這個序列至少有兩個數字,而序列的和爲 s,則small 應該小於 (1 + s)/2。
2、代碼

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > res;
        if(sum<3)
            return res;
        int small=1, big=2 ;
        int mid=(1+sum)/2;
        while(small<mid)
        {
            int curSum=(small+big)*(big-small+1)/2;
            if(curSum==sum)
            {
                vector<int> temp;
                for(int i=small;i<=big;++i)
                    temp.push_back(i);
                res.push_back(temp);
                small++;
            }
            if(curSum>sum)
                ++small;
            if(curSum<sum)
                ++big;
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章