剑指offer 和为S的连续正数序列
问题描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
C++代码实现
思路:1、暴力破解
2、双指针,滑动窗口
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> ret;
for (int i = 1; i <= sum / 2; i++)
{
int temp = 0;
vector<int> res;
for (int j = i; j <= sum; j++)
{
if (temp < sum)
{
res.push_back(j);
temp += j;
}
else
{
if (temp == sum)
{
ret.push_back(res);
}
break;
}
}
}
return ret;
}
};
1、初始化,i=1,j=1, 表示窗口大小为0
2、如果窗口中值的和小于目标值sum, 表示需要扩大窗口,j += 1
3、否则,如果窗口值和大于目标值sum,表示需要缩小窗口,i += 1
4、否则,等于目标值,存结果,缩小窗口,继续进行步骤2,3,4
转载
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> ret;
int i = 1, j = 1;
int temp = 0;
while(i <= sum / 2)
{
if (temp < sum)
{
temp += j;
j++;
}
else if (temp > sum)
{
temp -= i;
i++;
}
else
{
vector<int> res;
for (int k = i; k < j; k++)
{
res.push_back(k);
}
ret.push_back(res);
temp -= i;
i++;
}
}
return ret;
}
};
python2代码实现
# -*- coding:utf-8 -*-
class Solution:
def FindContinuousSequence(self, tsum):
# write code here
ret = []
i = 1
j = 1
temp = 0
while i <= tsum / 2:
if temp < tsum:
temp += j
j += 1
elif temp > tsum:
temp -= i
i += 1
else:
res = []
for k in range(i, j):
res.append(k)
ret.append(res)
temp -= i
i += 1
return ret