剑指 Offer 57 - II. 和为s的连续正数序列

题目介绍

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

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

示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]

示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

限制:

  • 1 <= target <= 10^5

解答

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        // 连续正数序列最大不超过 target / 2
        vector<vector<int>> res;
        int left = 1, right = 1;
        int sum = 0;

        while(left <= (target / 2)) // 左边界最大不超过 (target / 2)
        {
            if(sum < target)
            {
                sum += right;
                right++;
            }
            else if(sum > target)
            {
                sum -= left;
                left++;
            }
            else 
            {
                vector<int> ivec;
                for(int i = left; i < right; ++i)
                {
                    ivec.push_back(i);
                }
                res.push_back(ivec);
                sum -= left;
                left++;
            }
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode错题集,算法,数据结构)