刷题 - 和为S的连续正数序列 - 双指针/滑动窗

题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?

分析该题目,就是给定一个正数S,求所有和为S的连续的正数序列,本题目我们通过滑动窗来解决,滑动窗也可以理解为一种双指针,两个指针组成了窗口。

本题中,待分析的序列就是1、2、3、4、...、N,初始化两个指针分别指向1和2,计算窗内数据和s,将s与目标数S比较:

(1)s=S:该窗内数据为一个结果;

(2)s<S:窗内数据和不足,高位指针后移1位,扩大窗;

(3)s>S:窗内数据和过大,低位指针前移,缩小窗。

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > res;
        //初始化窗指针
        int low = 1,high = 2;
        //滑动窗
        while(low<high){
            int tmp = (high-low+1)*(low+high)/2;
            if(tmp == sum){
                vector<int> v;
                for(int i = low; i<=high; i++)
                    v.push_back(i);
                res.push_back(v);
                low++;
            }
            if(tmp < sum){
                high++;
            }
            if(tmp > sum){
                low++;
            }
        }
        return res;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章