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

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

输入一个正整数 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 <= 10^5

来源:力扣(LeetCode)

链接:力扣

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一解

使用滑动窗口,设 l,r 两个指针,s = l + l+1 + .. + r,若:

  • s > target: l 向右滑动

  • s < target: r 向右滑动

  • s == target: 结果放入 s , r 向右滑动


class Solution:

    def findContinuousSequence(self, target: int) -> List[List[int]]:

        l, r, s, res = 1, 2, 3, []

        while l < r:

            if s == target:

                res.append(list(range(l, r + 1)))

            if s >= target:

                s -= l

                l += 1

            else:

                r += 1

                s += r

        return res