面试题57

面试题57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

方法

1. 暴力:

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int> > res;
        for(int i = 1; i < target; i++) {
            int j = i, sum = 0;
            vector<int> v;
            while(sum < target) {
                sum += j;
                v.push_back(j);
                j++;
            }
            if(sum == target) {
                res.push_back(v);
            }
        }
        return res;
    }
};

优化 (滑动窗口) (尺取法)

左边界小于 target / 2就可以了因为只能取到两个连续整数, 如果target / 2 + target / 2 + 1都不能满足, target / 2 + 1 + targe5 / 2 + 2一定 > target
sum 为此时连续数字相加的值, 如果值 > target sum - i, i++ 如果值 < target , sum + j, j++; (注意顺序, sum 先 加上 j  j再++)
class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int> > res;
        int i = 1, j = 1, sum = 0;
        while(i <= (target + 1) / 2) {
            if(sum < target) {
                sum += j;
                j++;
            } else if(sum > target) {
                sum -= i;
                i++;
            } 
            if(sum == target) {
                vector<int> v;
                for(int k = i; k < j; k++) {
                    v.push_back(k);
                }
                res.push_back(v);
                sum -= i;
                i++;
            }
        }
        return res;
    }
};
原文地址:https://www.cnblogs.com/csyxdh/p/12435392.html