和为S的连续正数序列

和为S的连续正数序列

题目描述

输入一个正数, 打印出和为s的连续正数序列(至少含有两个数). 例如, 输入15, 由于1+2+3+4+5=4+5+6=7+8=15, 所以打印出3个连续序列1~5, 4~6, 7~8

使用两个游标left和right, left始终小于(sum+1)/2, 若当前和小于sum, 则右侧游标下移一位; 若当前和大于sum则左侧游标下移一位, 与此同时right游标更新为left游标的下一位

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> ret;
        if (2 > sum) {
            return ret;
        }
        int left = 1;
        int right = left + 1;
        
        while (left < ((sum + 1) / 2)) {
            int num = right - left + 1;
            // 当前的和
            int currentSum = (left + right) * num / 2;
            // 和相等
            if (sum == currentSum) {
                vector<int> temp;    // temp在这里声明下面temp.resize()可注释掉
                for (int i = left; i <= right; i++) {
                    temp.push_back(i);
                }
                ret.push_back(temp);
                //temp.resize(0);
                left += 1;
                right = left + 1;
                //continue;
            }
            // 和大于sum
            else if (sum < currentSum) {
                left += 1;
                right = left + 1;
                //continue;
            }
            else {
            // 和小于sum, 右边界+1
                right++;
            }
        }
        return ret;
    }
};

插一句没用的, 牛客上卖萌的题目描述终于没了

posted @ 2019-03-14 16:47  张飘扬  阅读(383)  评论(0编辑  收藏  举报