题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小
思路:一开始有点摸不着头脑,后来看了别人思路才知道。这里可以用滑窗法,相当于一开始两个指针,p1 = 1,p2 = 2;
如果p1和p2间的数小于sum,则p2向前移动,若大于sum,则p1向前移动。最后停止在p1和p2相等的地方。
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>>ans;
if(sum == 0)
return ans;
int ptr1 = 1 , ptr2 = 2;
int S;
while(ptr1 != ptr2)
{
S = (ptr1+ptr2)*(ptr2-ptr1+1)/2;
if(S<sum)
ptr2++;
else if(S>sum)
ptr1++;
else
{
vector<int>myAns;
for(int i =ptr1;i<=ptr2;i++)
myAns.push_back(i);
ans.push_back(myAns);
ptr1++;
}
}
return ans;
}
};