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

【题目】

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

【基本思路】

  使用两个指针small和big,small表示连续序列的首元素,big表示连续序列的尾元素,初始时small = 1,big = 2。此时序列的累加和total = 3。如果累加和小于s,则扩大序列,即big指针向右移动一位,调整total后继续和s比较;如果累加和大于s,则缩小序列,即small指针向右移动一位,调整total后继续和s比较。不断的扩大或缩小序列,直到累加和等于s,此时打印该序列,然后令small加1继续调整序列寻找下一个序列。
  由于序列中至少要包含两个元素,所以,small的值增加到(1+s) / 2就停止。

【代码实现】

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>> array;
        if(sum < 3){
            return array;
        }
        int small = 1;
        int big = 2;
        int mid = (1 + sum) / 2;
        int total = 3;
        while(small < mid){
            if(total > sum){
                total -= small;
                small++;
            }
            else if(total < sum){
                big++;
                total += big;
            }
            else{
                vector<int> arr;
                for(int i=small; i<=big; i++){
                    arr.push_back(i);
                }
                array.push_back(arr);
                total -= small;
                small++;
            }
        }
        return array;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34342154/article/details/78796444