和为S的连续正数序列
(今天看这个题把我给看急了,我就觉得应该用回溯,因为我之前也写过一个题:组合总和,跟这个题太像了,结果半天没写出来,怀着无比难过和沉重的心情看了大家都管他叫左神的大佬的解题思路,我的天,聪明的人的脑子果真跟我长的不一样,这下更难过了,非得看懂自己写出来才肯睡觉,默默埋怨一句,我咋就没有这么聪明呢)
思路:这个题其实就是一个等差数列的求和问题,大佬的解法是设置一个窗口,通过计算窗口前沿和后沿之间的数的和(题中说数字是连续的,可以看出它是公差为1的等差数列),当然是根据等差数列的求和公式算得等差数列的和,比sum小,那后沿窗口右移,比它大,前沿窗口后移。当然和sum相等的话就把这个窗口的数全都保存下来。
class Solution
{
public:
vector<vector<int> > FindContinuousSequence(int sum)
{
vector<vector<int>> vv;
int begin=1;
int end=2;
while(begin<end)
{
int cur=(begin+end)*(end-begin+1)/2; //等差数列的求和公式
if(cur==sum)
{
vector<int> v;
for(int i=begin;i<=end;i++)
{
v.push_back(i);
}
vv.push_back(v);
begin++;
}
else if(cur<sum)
end++;
else
begin++;
}
return vv;
}
};