本题要求找出所有和为 target 的连续正整数序列(至少两个数),并按首个数字从小到大排序。常见高效解法是滑动窗口(双指针),时间复杂度可降至 O(target)

解题思路:

使用两个指针 l 和 r 表示当前窗口的左右边界,初始为 1 和 2。计算窗口内的连续整数和 sum: 若 sum == target:记录当前序列,并将左指针右移。 若 sum < target:右指针右移,扩大窗口。 若 sum > target:左指针右移,缩小窗口。当左指针到达 target // 2 + 1 时结束,因为至少需要两个数。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param sum int整型 
# @return int整型二维数组
#
class Solution:
    def FindContinuousSequence(self , sum: int) -> List[List[int]]:
        # write code here
        l, r, ans = 1, 2, []#设置滑动窗口左右边界指针,存储结果的列表
        while l<r:
            s = (l+r)*(r-l+1)//2#计算当前滑动窗口内数值和
            if s==sum:#满足要求,加入结果列表,且左边界右移1位
                ans.append(list(range(l,r+1)))
                l += 1
            elif s>sum:#数值和大于结果,左边界右移1
                l += 1
            else:#数值和小于结果,右边界右移1
                r += 1
        return ans

验证与优化

可通过示例 target=9、target=15 验证输出是否与题意一致。滑动窗口保证每个数只被访问一次,效率高于暴力枚举。

技巧与注意事项

数学公式 (l + r) * (r - l + 1) // 2 可快速求区间和,避免循环累加。左右指针只向右移动,不会回退,确保时间复杂度最优。当 target <= 2 时,无解直接返回空列表。