剑指offer 43.和为S的连续正数序列

  1. 题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
  2. 思路
    1. 用一个队列记录连续正数序列的和,如果等于sum写入答案,如果大于将左边的数字移除队列
    2. 如果index的元素没有进去队列,需要for循环中i--
    3. 最后遍历完数组之后,还需要检查队列中连续序列的和是否为sum,如果等于sum写入答案
  3. 启发或者坑
    1. 队列的函数是:pop push front等
  4. 代码
    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            queue<int> values;
            int temp_sum = 0;
            vector<vector<int> > res;
            for (int i = 1; i < sum; i++) {
                if (temp_sum == sum) {
                    vector<int> oneres;
                    while (!values.empty()) {
                        oneres.push_back(values.front());
                        values.pop();
                    }
                    for (int i = 1; i < oneres.size(); i++) {
                        values.push(oneres[i]);
                    }
                    temp_sum -= oneres[0];
                    res.push_back(oneres);
                    //index的元素没有进去队列,那么就需要i--
                    i--;
                } else if (temp_sum < sum) {
                    values.push(i);
                    temp_sum += i;
                } else {
                    temp_sum -=values.front();
                    values.pop();
                    //index的元素没有进去队列,那么就需要i--
                    i--;
                }
            }
            //每次都是还没有push进去的时候检查,所以for循环的最后
            if (temp_sum == sum) {
                vector<int> oneres;
                while (!values.empty()) {
                    oneres.push_back(values.front());
                    values.pop();
                }
                res.push_back(oneres);
            }
            return res;
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7383

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103933945