• 剑指offer---和为S的连续正数序列


    题目:和为S的连续正数序列

    要求:输入一个正数S,返回所有和为S的正数序列,见下例;


    例如:

    输入:

    • S=15

    输出:

    • {1, 2, 3, 4, 5}
    • {4, 5, 6}
    • {7, 8}

    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            
        }
    };

    解题代码:

    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            // 边界处理
            vector<vector<int> > res;
            if(sum < 3)
                return res;
            //
            int mid = (sum + 1)/2;
            int low = 1;
            int high = 2;
            while(low < mid){
                if(mysum(low, high) < sum)
                    high++;
                else if(mysum(low, high) > sum)
                    low++;
                else{
                    res.push_back(printRes(low, high));
                    high++;
                }
            }
            return res;
        }
    private:
        // 计算从start到end的和
        int mysum(int start, int end){
            int sum = 0;
            while(start <= end){
                sum += start;
                start++;
            }
            return sum;
        }
        // 将start到end之间的数字保存到subRes
        vector<int> printRes(int start, int end){
            vector<int> subRes;
            while(start <= end){
                subRes.push_back(start);
                start++;
            }
            return subRes;
        }
    };

    更新一下,发现上述代码(运行时间:4ms占用内存:600k)计算求和的时候出现了重复计算的问题,没有很好的利用上次计算的结果,改进版本如下:

    class SolutionOpt {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            // 边界处理
            vector<vector<int> > res;
            if(sum < 3)
                return res;
            //
            int mid = (sum + 1)/2;
            int low = 1;
            int high = 2;
            int curSum = low + high;
            while(low < mid){
                if(curSum == sum)
                    res.push_back(printSubRes(low, high));
    
                while(curSum > sum && low < high){
                    curSum -= low;
                    low++;
                    if(curSum == sum)
                        res.push_back(printSubRes(low, high));
                }
                high++;
                curSum += high;
            }
            return res;
        }
    private:
        // 将start到end之间的数字保存到subRes
        vector<int> printSubRes(int start, int end){
            vector<int> subRes;
            while(start <= end){
                subRes.push_back(start);
                start++;
            }
            return subRes;
        }
    };

    改进版运行时间:3ms,占用内存:472k

  • 相关阅读:
    Linux中OCI开发库的配置
    makefile中的gcc -o $@ $^是什么意思?
    【转】gcc中的-w -W和-Wall选项
    【转】Linux查看系统是32位还是64位方法总结
    【转】gcc命令中参数c和o混合使用的详解
    Python2.7设置在shell脚本中自动补全功能的方法
    Python3设置在shell脚本中自动补全功能的方法
    Pyqt图标下载网站
    如何使QLineEdit禁止编辑
    python偏函数的运用
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/9964357.html
Copyright © 2020-2023  润新知