和为s的连续正数序列
题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
1 < = t a r g e t < = 1 0 5 1 <= target <= 10^5 1<=target<=105
思路
设置大小两个指针分别代表序列的头和尾,初始时为1,2
- 序列和<target,尾向后移动一位
- 序列和>target,头向后移动一位
- 序列和=target,保存此序列和为结果之一,然后头向后移动一位
因为要求至少含有两个数,所以临界条件是 s m a l l < ( t a r g e t + 1 ) / 2 small<(target +1)/2 small<(target+1)/2
**C++ **
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
int small=1;
int big=2;
vector<vector<int>> res;
while(small < (target+1)/2)
{
int sum = 0;
for(int i=small; i<=big; ++i)
sum+=i;
if(sum<target)
++big;
else if(sum>target)
++small;
else
{
vector<int> temp;
for(int i=small; i<=big; ++i)
temp.push_back(i);
res.push_back(temp);
++small;
continue;
}
}
return res;
}
};
python
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
res = []
small, big = 1, 2
while small < (target+1)//2:
sums = 0
for i in range(small, big+1):
sums += i
if sums < target:
big += 1
elif sums > target:
small += 1
else:
temp = []
for i in range(small, big+1):
temp.append(i)
res.append(temp)
small += 1
continue
return res