您的位置:首页 > 其它

AcWing 76 和为S的连续正数序列

2019-03-15 15:24 204 查看

题目描述:

输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。

样例

[code]输入:15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]

分析:

我们知道,设i为连续序列的第一个元素,j为连续序列的最后一个元素。比如上例,第一个解i=1,j=5,到第二个解时,i必然后移,从而导致s减少,所以j也要后移才能找到下一组解。知道了解的单调性,我们就能够通过双指针逐步右移一遍遍历就能够找到所有的解了。

初始情况i,j均为1,j不断右移直到s不小于sum为止,如果此时s恰好等于sum,则找到一组解。i指针右移并且不要忘了在右移前将s减去i,再次重复上述过程。其实这里i遍历到sum/2就可以终止了,时间复杂度为线性级别。

[code]class Solution {
public:
vector<vector<int> > findContinuousSequence(int sum) {
vector<vector<int> > ans;
for(int i = 1,j = 1,s = 1;i <= sum;i++){
while(s < sum)  s += ++j;
if(s == sum && j - i > 0){
vector<int> line;
for(int k = i;k <= j;k++)   line.push_back(k);
ans.push_back(line);
}
s -= i;
}
return ans;
}
};

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: