题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出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;
}
};