題目描述:
小明很喜歡數學,有一天他在做數學作業時,要求計算出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;
}
};