刷題 - 和爲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;
    }
};

 

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