《剑指offer》第五十七题II:为s的连续正数序列

// 面试题57(二):为s的连续正数序列
// 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。
// 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、
// 4~6和7~8。

#include <cstdio>

void PrintContinuousSequence(int small, int big);

void FindContinuousSequence(int sum)
{
    if (sum < 3)
        return;

    int small = 1;
    int big = 2;
    int middel = (1 + sum) / 2;  //s的中位数, 因为至少包含2个数字
    int curSum = small + big;

    while (small < middel)
    {
        if (curSum == sum)
            PrintContinuousSequence(small, big);

        while (curSum > sum && small < middel)  //若结果大于s, 则应减少最小数字
        {
            curSum -= small;
            ++small;

            if (curSum == sum)
                PrintContinuousSequence(small, big);
        }

        ++big;
        curSum += big;  //若结果小于s, 则应包含更多数字
    }
}

void PrintContinuousSequence(int small, int big)
{
    for (int i = small; i <= big; ++i)
        printf("%d ", i);

    printf("\n");
}
// ====================测试代码====================
void Test(const char* testName, int sum)
{
    if (testName != nullptr)
        printf("%s for %d begins: \n", testName, sum);

    FindContinuousSequence(sum);
}

int main(int argc, char* argv[])
{
    Test("test1", 1);
    Test("test2", 3);
    Test("test3", 4);
    Test("test4", 9);
    Test("test5", 15);
    Test("test6", 100);

    return 0;
}
测试代码

分析:妙啊。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        
        int small = 1;
        int big = 2;
        int middle = (sum + 1) >> 1;
        int curSum = small + big;
        
        vector<vector<int> > result;
        
        while (small < middle)
        {
            if (curSum == sum)
                vectorPush(result, small, big);
            
            while (curSum > sum && small < middle)
            {
                curSum -= small;
                ++small;
                
                if (curSum == sum)
                vectorPush(result, small, big);
            }
            ++big;
            curSum += big;
        }
        return result;
    }
    vector<vector<int> > vectorPush(vector<vector<int> > &result, int small, int big) //注意引用
    {
        vector<int> temp;
        for (int i = small; i <= big; ++i)
            temp.push_back(i);
        
        result.push_back(temp);
        
        return result;
    }
};
牛客网提交代码

 

posted @ 2020-04-08 17:06  源周率  阅读(234)  评论(0编辑  收藏  举报