和为s的连续正数序列 II

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    vector<vector<int>> cseq;
    vector<vector<int>> findContinuousSequence(int target) {
      find(target);
      return cseq; 
    }
   
    void find(int target) {
        int small = 1, big = 2;
        int middle = (1 + target) / 2;//中间数字,
        int sum = small + big;

//一直增加small到中间值,因为要求至少含有两个数字
        while(small < middle){
            if(sum < target){

                //小于目标值
                //增加序列右边较大值
                big++;
                //加上新增大值
                sum += big;

            }else if (sum == target){

                //打印和为target的连续序列
                printfsqnumbers(small, big);
                //新增大值,再查找满足条件的有序序列
                big++;
                sum += big;//加上新增大值

            }else{
                //大于目标值,砍去序列中最小的数small,
                //意味着序列的最小数字值从small + 1算起
                   
                 //减去最小数字
                sum -= small;
                
                //序列最小数字值加1
                small++;
            }
        }
    }

     void printfsqnumbers(int small, int big){
        vector<int> sqSum;
         for(int i = small; i <= big; i++){
             sqSum.push_back(i);
         }
         cseq.push_back(sqSum);
     }
};

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/106978976