剑指 Offer 57 - II. 和为s的连续正数序列

151 阅读1分钟

题目描述

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]

示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

解题思路: 快慢指针法

  1. 使用快慢指针组成一个滑动窗口, 判断窗口中的和是否与target相等
  2. 初始化快慢指针分别指向1, 2, 初始sum = 3. 进行遍历
  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