题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
思路:我们用两个变量small和big分别记录序列的最小值和最大值,并且将两者分别初始化为1和2,用cursum记录从small到big范围内数的和,当cursum等于sum时,将从small到big的序列输出。如果cursum小于sum时,增大big,如果cursum大于sum时,增大small。直到small大于或等于sum的一半。
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
if(sum<2) return {};
vector<vector<int> > ans;
int small = 1;
int big =2;
int mid=(small+sum)/2;
int cursum=small+big;
while(small<mid)
{
if (cursum ==sum)
ans.push_back(result(small,big));
while(cursum>sum&&small<mid)
{
cursum-=small;
++small;
if (cursum ==sum)
ans.push_back(result(small,big));
}
++big;
cursum+=big;
}
return ans;
}
vector<int> result(int small,int big)
{
vector<int> ans;
for(int i=small;i<=big;++i)
ans.push_back(i);
return ans;
}
};
python的解法:
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
if tsum <= 2:
return []
ans = []
small = 1
big = 2
mid = int((small + tsum) / 2)
cursum = small + big
while small < big and small < mid:
if cursum == tsum:
ans.append(self.result(small, big))
while cursum > tsum and small < mid:
cursum -= small
small += 1
if cursum == tsum:
ans.append(self.result(small, big))
big += 1
cursum += big
return ans
def result(self, small, big):
ans = []
while (small <= big):
ans.append(small)
small += 1
return ans