题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
解题思路
考虑用f和l记录序列的前后端点,其中f初始化为1,l初始化为2.当序列[f,l]的和等于sum时,依次把序列添加到vector中并加入到结果;当序列[f,l]的和小于sum时,需要向序列添加更大的数,所以让l加1;当序列[f,l]的和大于sum时,需要去掉序列中较小的数,所以让f加1.因为序列至少包括两个数,所以f最大为sum/2.
代码
1 class Solution { 2 public: 3 vector<vector<int> > FindContinuousSequence(int sum) { 4 vector<vector<int> > vs; 5 int f=1,l=2; 6 while(f<=sum/2){ 7 int s=add(f,l); 8 if(s==sum){ 9 vector<int> v; 10 for(int i=f;i<=l;i++) 11 v.push_back(i); 12 vs.push_back(v); 13 f++; 14 } 15 else if(s<sum) 16 l++; 17 else f++; 18 } 19 return vs; 20 } 21 int add(int f,int l){ 22 return (f+l)*(l-f+1)/2; 23 } 24 };