题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
解题思路: 快慢指针法
- 使用快慢指针组成一个滑动窗口, 判断窗口中的和是否与target相等
- 初始化快慢指针分别指向1, 2, 初始sum = 3. 进行遍历
- 当sum小于target, 让快指针后移, 并且sum加上当前元素; 当sum大于target, 让慢指针后移, 并且sum减去当前元素; 当sum与target相等时, 将快慢指针中间的元素组成集合加入res, 并且将慢指针后移继续查找
示例代码
def findContinuousSequence(self, target: int) -> List[List[int]]:
l, r, sum = 1, 2, 3
res = []
while l < r:
if sum < target:
r += 1
sum += r
elif sum > target:
sum -= l
l += 1
else:
res.append(list(range(l, r + 1)))
sum -= l
l += 1
a = list(range(l, r + 1))
return res